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

gaofzhs 2013-11-30 11:10:23
2个方法,一个将处理好的String存到StringBuilder里,一个将StringBuilder里的内容存到Txt里,用双线程应该怎么处理?跪求一段代码。
...全文
285 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaofzhs 2013-12-10
  • 打赏
  • 举报
回复
感谢各位,前几天结婚,没来得及结贴,多多包涵~!
yanchangshan 2013-12-06
  • 打赏
  • 举报
回复
最近想学习线程 这里标记下
sswwee 2013-12-06
  • 打赏
  • 举报
回复
如果你觉得字符串读取写入确实需要用线程的地步那就必须加锁,否则会有脏数据。
Falleyes 2013-12-01
  • 打赏
  • 举报
回复
#7的解答OK
你的选择B 2013-12-01
  • 打赏
  • 举报
回复

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());
        }
  • 打赏
  • 举报
回复
只要一个
backgroundworker
就可搞定!
maomiaomi 2013-11-30
  • 打赏
  • 举报
回复
用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);
			}
		}
	}
gaofzhs 2013-11-30
  • 打赏
  • 举报
回复
引用 1 楼 gomoku 的回复:
这样的两个处理,一般都不需要线程。
因为写出来的文本比较大,所以想一边转换一边写。
gomoku 2013-11-30
  • 打赏
  • 举报
回复
这样的两个处理,一般都不需要线程。
threenewbee 2013-11-30
  • 打赏
  • 举报
回复
用队列比用stringbuilder好。
时空恋 2013-11-30
  • 打赏
  • 举报
回复
P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。 V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。 设s1=n(n=StringBuilder的最大容量) P(s1)..存放一个数据。 V(s1)..写一个数据,将StringBuilder里的内容存到Txt里。
时空恋 2013-11-30
  • 打赏
  • 举报
回复
用PV控制。
PaulyJiang 2013-11-30
  • 打赏
  • 举报
回复
BackGroundWorker

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧