读书人

C#双线程处理有关问题跪求~

发布时间: 2013-12-11 16:44:13 作者: rapoo

C#双线程处理问题,跪求~!
2个方法,一个将处理好的String存到StringBuilder里,一个将StringBuilder里的内容存到Txt里,用双线程应该怎么处理?跪求一段代码。C#双线程处理有关问题,跪求~
[解决办法]
P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。
V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。

设s1=n(n=StringBuilder的最大容量)
P(s1)..存放一个数据。
V(s1)..写一个数据,将StringBuilder里的内容存到Txt里。


[解决办法]
用StringBuilder如果不加锁你没办法保证操作时的线程安全,而如果加锁的话和你希望同步处理的初衷又违背了,所以不要用stringbuilder,
附上使用Queue的方法


public class StringQueueTest
{
private int cnt=0;
private Queue<string> strings=new Queue<string>();

public StringQueueTest()
{
Thread thread1=new Thread(new ThreadStart(Start1));
Thread thread2=new Thread(new ThreadStart(Start2));
thread1.Start();
thread2.Start();
}


private void Start1()
{
while (true)
{
string s=(cnt++).ToString();
Console.WriteLine(s);
strings.Enqueue(s);
Thread.Sleep(1000);
}
}

private void Start2()
{
while (true)
{
while (strings.Count>0)
{
Console.WriteLine(strings.Dequeue());
}
Thread.Sleep(100);
}
}
}

[解决办法]
只要一个
backgroundworker
就可搞定!
[解决办法]

private static StringBuilder strs = new StringBuilder();
private static BackgroundWorker backgroundWorker;

static void Main(string[] args)
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += TransString;
backgroundWorker.RunWorkerCompleted += DisplayString;

//处理string
for (int i = 0; i < 10; i++)
{
string str = Console.ReadLine();
backgroundWorker.RunWorkerAsync(Tuple.Create(strs.ToString(), str));
strs.Append(str);
}

Console.ReadLine();
}

/// <summary>
/// 传递string
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void TransString(object sender,DoWorkEventArgs e)
{
var t = e.Argument as Tuple<string,string>;

e.Result = t.Item1 + t.Item2;
}

/// <summary>
/// 显示string
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void DisplayString(object sender, RunWorkerCompletedEventArgs e)
{


Console.WriteLine(e.Result.ToString());
}

读书人网 >C#

热点推荐