最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# List 并發(fā)丟數(shù)據(jù)問題原因及解決方案

 更新時間:2021年02月20日 08:41:35   作者:丹楓無跡  
這篇文章主要介紹了C# List 并發(fā)丟數(shù)據(jù)問題原因及解決方案,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

項目中出了個 BUG,就在我眼皮子底下,很明顯的一個 BUG,愣是看了兩天才看出來。

我有多個任務并發(fā),任務執(zhí)行完成后都有一個返回結果,我用一個 List 將結果收集起來,等所有任務完成后,發(fā)送出去。結果一直 丟數(shù)據(jù)。

我反復檢查邏輯都沒有問題,最后恍然 List 是非線程安全的。

大家都知道 List 是非線程安全的,但是如果僅有 Add 操作呢?估計有些人就會認為沒問題。

下面的代碼,期望輸出的結果是 1000,然而,注釋掉 lock 后,結果就不一樣了。

class Program
{
 static List<Person> persons;

 static void Main(string[] args)
 {
  persons = new List<Person>();

  object sync = new object();

  Parallel.For(0, 1000, (i) =>
  {
   Person person = new Person
   {
    ID = i,
    Name = "name" + i
   };
   lock (sync)
    persons.Add(person);
  });

  Console.WriteLine(persons.Count);
  Console.ReadLine();
 }

 class Person
 {
  public int ID { get; set; }
  public string Name { get; set; }
 }
}

利用安全集合ConcurrentBag取代list

測試程序

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MyConcurrent
{
  class Program
  {
    /// <summary>
    /// ConcurrentBag并發(fā)安全集合
    /// </summary>
    public static void ConcurrentBagWithPallel()
    {
      ConcurrentBag<int> list = new ConcurrentBag<int>();
      Parallel.For(0, 10000, item =>
      {
        list.Add(item);
      });
      Console.WriteLine("ConcurrentBag's count is {0}", list.Count());
      int n = 0;
      foreach (int i in list)
      {
        if (n > 10)
          break;
        n++;
        Console.WriteLine("Item[{0}] = {1}", n, i);
      }
      Console.WriteLine("ConcurrentBag's max item is {0}", list.Max());
    }
    
 
    /// <summary>
    /// 函數(shù)入口
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
      Console.WriteLine("ConcurrentBagWithPallel is runing" );
      ConcurrentBagWithPallel();
 
      Console.Read();
    }

以上就是C# List 并發(fā)丟數(shù)據(jù)問題原因及解決方案的詳細內(nèi)容,更多關于C# List 并發(fā)丟數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • c#網(wǎng)絡喚醒功能實現(xiàn)

    c#網(wǎng)絡喚醒功能實現(xiàn)

    網(wǎng)絡喚醒實現(xiàn)了對網(wǎng)絡的集中管理,即在任何時刻,網(wǎng)管中心的IT管理人員可以經(jīng)由網(wǎng)絡遠程喚醒一臺處于休眠或關機狀態(tài)的計算機,下面使用c#實現(xiàn)網(wǎng)絡喚醒功能
    2014-01-01
  • Unity實現(xiàn)虛擬搖桿效果

    Unity實現(xiàn)虛擬搖桿效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)虛擬搖桿效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#針對xml文件轉化Dictionary的方法

    C#針對xml文件轉化Dictionary的方法

    這篇文章主要介紹了C#針對xml文件轉化Dictionary的方法,是C#操作XML文件的典型應用,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#異常處理總結及簡單實例

    C#異常處理總結及簡單實例

    這篇文章主要介紹了C#異常處理總結及簡單實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • winform壁紙工具為圖片添加當前月的日歷信息

    winform壁紙工具為圖片添加當前月的日歷信息

    使用用winform做了一個設置壁紙小工具,為圖片添加當月的日歷并設為壁紙,可以手動/定時設置壁紙,最主要的特點是在圖片上生成當前月的日歷信息,感興趣的你可以參考下
    2013-03-03
  • C#文件讀寫操作詳細操作指南

    C#文件讀寫操作詳細操作指南

    這篇文章主要給大家介紹了關于C#文件讀寫操作詳細操作指南,在后端開發(fā)中使用C#語言進行文件操作是一個常見的任務,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 10分鐘學會VS NuGet包私有化部署

    10分鐘學會VS NuGet包私有化部署

    本文主要介紹了10分鐘學會VS NuGet包私有化部署,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#中out與ref作用區(qū)別示例分析

    C#中out與ref作用區(qū)別示例分析

    這篇文章主要為大家介紹了C#中out與ref作用區(qū)別示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 詳解C# partial 關鍵字的使用

    詳解C# partial 關鍵字的使用

    局部類型允許我們將一個類、結構或接口分成幾個部分,分別實現(xiàn)在幾個不同的.cs文件中。接下來通過本文給大家分享C# partial 關鍵字的使用,感興趣的的朋友一起看看吧
    2017-08-08
  • C#同步、異步遠程下載文件實例

    C#同步、異步遠程下載文件實例

    使用C#下載一個Internet上的文件主要是依靠HttpWebRequest/HttpWebResonse和WebClient。具體處理起來還有同步和異步兩種方式,所以我們其實有四種組合
    2014-04-04

最新評論

吉隆县| 武陟县| 会同县| 兴化市| 荔波县| 涿州市| 张家港市| 邮箱| 宝应县| 峡江县| 商城县| 仙游县| 德惠市| 三江| 南投县| 拜城县| 蒙山县| 石渠县| 高唐县| 九江市| 上虞市| 库尔勒市| 邯郸县| 姚安县| 石渠县| 镇宁| 东安县| 长海县| 沧源| 万载县| 土默特右旗| 济源市| 睢宁县| 黔西县| 保德县| 五指山市| 如东县| 阿拉尔市| 济阳县| 新宾| 永丰县|