首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-12-11 
C#双线程处理问题,跪求~!2个方法,一个将处理好的String存到StringBuilder里,一个将StringBuilder里的内容

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());
        }

热点排行