欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)問題原因及解決方案的詳細內容,更多關于C# List 并發(fā)丟數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • C#簡單生成縮略圖的方法

    C#簡單生成縮略圖的方法

    這篇文章主要介紹了C#簡單生成縮略圖的方法,涉及C#操作圖片的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#中ListView用法實例

    C#中ListView用法實例

    我們經常會在應用程序中使用列表的形式來展現(xiàn)一些內容,所以學好ListView是非常必需的,下面這篇文章主要給大家介紹了關于C#中ListView用法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 使用C#獲取遠程圖片 Form用戶名與密碼Authorization認證的實現(xiàn)

    使用C#獲取遠程圖片 Form用戶名與密碼Authorization認證的實現(xiàn)

    本篇文章介紹了,使用C#獲取遠程圖片 Form用戶名與密碼Authorization認證的實現(xiàn)。需要的朋友參考下
    2013-04-04
  • Unity3D實現(xiàn)自動尋路

    Unity3D實現(xiàn)自動尋路

    這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)自動尋路,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 在C#中 webbrowser的使用心得

    在C#中 webbrowser的使用心得

    最近用webbrowser做了個東西,期間有點小曲折,而且網上的解決方法也基本都是淺嘗輒止,特此在這里發(fā)一下同大家分享。

    2013-04-04
  • C#解碼base64編碼二進制數(shù)據(jù)的方法

    C#解碼base64編碼二進制數(shù)據(jù)的方法

    這篇文章主要介紹了C#解碼base64編碼二進制數(shù)據(jù)的方法,涉及C#中Convert類的靜態(tài)方法Convert.FromBase64String使用技巧,需要的朋友可以參考下
    2015-04-04
  • C#實現(xiàn)全局快捷鍵功能

    C#實現(xiàn)全局快捷鍵功能

    這篇文章介紹了C#實現(xiàn)全局快捷鍵功能的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實現(xiàn)無損壓縮圖片代碼示例

    C#實現(xiàn)無損壓縮圖片代碼示例

    這篇文章介紹了C#實現(xiàn)無損壓縮圖片的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中GraphicsPath的Widen方法用法實例

    C#中GraphicsPath的Widen方法用法實例

    這篇文章主要介紹了C#中GraphicsPath的Widen方法用法,實例分析了Widen方法的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#函數(shù)式編程中的緩存技術詳解

    C#函數(shù)式編程中的緩存技術詳解

    這篇文章主要介紹了C#函數(shù)式編程中的緩存技術詳解,本文我們將分成兩部分來講解,第一部分為預計算,第二部分則為緩存,需要的朋友可以參考下
    2015-01-01

最新評論