// 做一件无需等待的事情
// 如一个接口完成一件操作
// 需要额外更新的操作放到此异步方法内
// 问:额外更新的是同步操作,是否有必要做成异步形式
// 如果做成这样,那么此方式是否影响到性能,比如开辟过多的线程?
private static aysnc void DoSomething()
{
//是否需要包在 Task.Run 内
await Task.Run(() =>
{
// 以下几种可能是同步处理代码的情况
// 1 、普通处理只需 CPU 计算
// 2 、需要数据库读写等 I/O 操作
}
}
1
Zhuzhuchenyan 2021-07-30 18:51:51 +08:00 1
|
2
ljchengx 2021-07-31 08:27:00 +08:00 1
之前处理过,大批量的数据同步操作,也用到了 Task,写了两个例子 可以参考下,希望有帮助:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { public static bool _go = true; public static int currentTeacherCount = 0; public static int maxTask = 15; public static object obj = new object(); static void Main(string[] args) { List<Task> tasks = new List<Task>(); List<String> list = new List<string>(); list.Add("1"); list.Add("2"); list.Add("3"); list.Add("4"); foreach (var item in list) { tasks.Add(Task.Factory.StartNew(() => { Log(item); }).ContinueWith(t => { lock (obj) { Interlocked.Increment(ref currentTeacherCount); Console.WriteLine("第" + currentTeacherCount + "数据同步完成,共" + list.Count() + "数据需要处理"); } })); if (tasks.Count >= maxTask) { Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(t => t.Status == TaskStatus.Running).ToList(); } } Task.WaitAll(tasks.ToArray()); Console.WriteLine("所有线程结束!"); Console.ReadLine(); } public static void Log(String str) { Console.WriteLine("开始处理第" + str + "个"); } } } |
3
ljchengx 2021-07-31 08:27:44 +08:00
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { public static bool _go = true; public static int currentTeacherCount = 0; public static int maxTask = 15; public static object obj = new object(); public static bool _go_LogStastic = true; //阀门 //轮询的多线程 static void Main(string[] args) { while (_go) { if (_go_LogStastic) { _go_LogStastic = false; var task = new Task(delegate() { Log("1"); }); task.Start(); task.ContinueWith(q => { _go_LogStastic = true; }); } } Console.WriteLine("所有线程结束!"); Console.ReadLine(); } public static void Log(String str) { Console.WriteLine("开始处理第" + str + "个"); } } } |