在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C#  Linux/ c#多線程處理單線程產(chǎn)生的數(shù)據(jù)

c#多線程處理單線程產(chǎn)生的數(shù)據(jù)

需求描述:

1.項(xiàng)目啟動時創(chuàng)建一個線程一直讀取日志文件(目前已經(jīng)完成);
2.在上一線程中每讀200行數(shù)就創(chuàng)建一個新的線程處理這200行數(shù)據(jù);

問題:由于在Fun1中不斷創(chuàng)建線程并調(diào)用Fun2,F(xiàn)un2總是報(bào)錯為listStr已更改,不知道這樣寫是否正確

代碼: public static void Main(string[] args)

    {
    ThreadPool.QueueUserWorkItem(Fun1)
    }
    
    public void Fun1()
    {
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
             using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
            {
                string Line=string.empty;
                List<string> listStr=new List<string>();
                while((line = sr.ReadLine()) != null)
                {
                    if (listStr.Count == 200)
                    {
                        analytickal = new AnalyticalArithmetic();
                        ThreadPool.QueueUserWorkItem(new WaitCallback(Fun2), listStr);
                        listStr.Clear();
                    }
                    listStr.Add(line);
                }
            }
        }
    }
    
    public void Fun2(Object listStr)
    {
    //這個方法處理數(shù)據(jù)
    }
回答
編輯回答
陌如玉
  1. listStr 傳遞的是引用,所以這里不論創(chuàng)建多少個線程使用的都是同一個listStr,要么每次重新構(gòu)建,要么傳遞listStr.ToArray();

  2. 多線程建議使用Task處理

2018年6月4日 07:10
編輯回答
朕略傻

Fun2不知道處理那部分?jǐn)?shù)據(jù)。你每次傳入進(jìn)去的都是同一個List。
解決方案:
1.告訴Fun2應(yīng)該處理list中哪部分?jǐn)?shù)據(jù)。
2.每次重新new一個list給Fun2,然后處理完之后return出來。

2017年12月3日 11:36