并发字典ConcurrentDictionary+迭代器--异步
代码如下:
using Microsoft.EntityFrameworkCore; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace EFCOREDB { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); #region //GetAsync(); //var iterator = GetEnumerator(); //while (iterator.MoveNext()) //{ // Console.WriteLine($"输出{iterator.Current}"); //} #region 测试 //TestConcurrentDictionary(); #endregion Console.Read(); } #region 测试并发字典ConcurrentDictionary+迭代器--异步 /// <summary> /// 迭代器--异步 /// </summary> /// <returns></returns> static async void GetAsync() { var iterator = GetEnumeratorAsyncFor(); while (await iterator.MoveNextAsync()) { Console.WriteLine($"输出{iterator.Current}"); } #region MyRegion //var iterator = GetEnumeratorAsync(); // var result = await iterator.MoveNextAsync(); // while (result) // { // Console.WriteLine($"输出{iterator.Current}"); // result = await iterator.MoveNextAsync(); // } // //while (await iterator.MoveNextAsync()) // //{ // // Console.WriteLine($"输出{iterator.Current}"); // //} #endregion Console.WriteLine("GetAsync---结束。。。。"); } /// <summary> /// 迭代器--异步 /// </summary> /// <returns></returns> static async IAsyncEnumerator<string> GetEnumeratorAsyncFor() { for (int i = 0; i < 10; i++) { //await Task.Delay(1000); //yield return i.ToString(); await Task.Delay(1000).ContinueWith((_) => { Console.WriteLine($"迭代器--异步--{i}"); }); yield return i.ToString(); } Console.WriteLine("GetEnumeratorAsync---结束。。。。"); } /// <summary> /// 迭代器--异步 /// </summary> /// <returns></returns> static async IAsyncEnumerator<string> GetEnumeratorAsync() { await Task.Delay(1000); //Console.WriteLine("输出A"); yield return "B"; await Task.Delay(1000); //Console.WriteLine("输出A"); yield return "C"; await Task.Delay(1000); //Console.WriteLine("输出A"); yield return "D"; Console.WriteLine("GetEnumeratorAsync---结束。。。。"); } /// <summary> /// 迭代器 /// </summary> /// <returns></returns> static IEnumerator<string> GetEnumerator() { yield return "A"; //Console.WriteLine("输出A"); yield return "B"; //Console.WriteLine("输出A"); yield return "C"; //Console.WriteLine("输出A"); yield return "D"; Console.WriteLine("结束。。。。"); } /// <summary> /// 测试并发字典ConcurrentDictionary /// </summary> static void TestConcurrentDictionary() { #region MyRegion ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(); Parallel.For(1, 100, i => { cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1); }); Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]); // Should return 100, as key 2 is not yet in the dictionary int value = cd.GetOrAdd(2, (key) => 100); Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value); // Should return 100, as key 2 is already set to that value value = cd.GetOrAdd(2, 10000); Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value); //Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value); #endregion } #endregion } }