c# - 这是使 4 个方法同时异步运行的正确方法吗?
问题描述
这是使 4 个方法同时异步运行的正确方法吗?
Version 1:
public void startup()
{
var aTask = Task.Run(async () => {
Console.WriteLine(Fetchstuff1");
var data3 = await GetStuff1();
});
var bTask = Task.Run(async () => {
Console.WriteLine("[Fetchstuff1stuff2");
var data1= await GetStuff2();
});
var cTask = Task.Run(async () => {
Console.WriteLine(Fetchstuff1stuff3");
var data2 = GetStuff3();
});
Task.WaitAll(aTask, bTask, cTask);
// DO STUFF AFTER ALL TASK OVER IS DONE
var categories = GetCategories();
var dt= CreateDatable();
Sendtodatabase();
}
public async Task<string> Dostuff1,2,3()
{
try
{
using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
using (HttpContent content = result.Content)
{
result.EnsureSuccessStatusCode();
string data = await content.ReadAsStringAsync();
}
return data;
}
catch (Exception ex)
{
Console.WriteLine("Error"
}
}
版本 2:
public async Taskstartup()
{
await Task.WaitAll(lol());
// DO STUFF AFTER ALL TASK OVER IS DONE
var categories = GetCategories();
var dt= CreateDatable();
Sendtodatabase();
}
private async Task lol() {
await Task.Run(async () =>
{
Console.WriteLine(Fetchstuff1");
var data3 = await GetStuff1();
Console.WriteLine("[Fetchstuff1stuff2");
var data1= await GetStuff2();
Console.WriteLine(Fetchstuff1stuff3");
var data2 = GetStuff3();
});
}
public async Task<string> Dostuff1,2,3()
{
try
{
using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
using (HttpContent content = result.Content)
{
result.EnsureSuccessStatusCode();
string data = await content.ReadAsStringAsync();
}
return data;
}
catch (Exception ex)
{
Console.WriteLine("Error"
}
}
第 3 版:
public void startup()
{
Console.WriteLine(Fetchstuff1");
var task1= GetStuff1();
Console.WriteLine("[Fetchstuff1stuff2");
var task2 = GetStuff2();
Console.WriteLine(Fetchstuff1stuff3");
var task3= GetStuff3();
Task.WhenAll(task1, task2, task3);
List<String> data1 = await task1;
List<String> data2 = await task2;
List<String> data3 = await task3;
// DO STUFF AFTER ALL TASK OVER IS DONE
var categories = GetCategories();
var dt= CreateDatable();
Sendtodatabase();
}
public async Task<string> Dostuff1,2,3()
{
try
{
using (HttpResponseMessage result = await _httpClient.GetAsync(Adrdess))
using (HttpContent content = result.Content)
{
result.EnsureSuccessStatusCode();
string data = await content.ReadAsStringAsync();
}
return data;
}
catch (Exception ex)
{
Console.WriteLine("Error"
}
}
我想做的是让 a,b,c 任务同时运行,因为它们只检索一些数据。然后我希望该方法等到所有任务都返回,然后在所有任务完成后继续执行功能并执行操作。
这是正确完成还是我可以以更干净的方式完成?我应该使用异步任务启动()吗?我删除了它,因为我没有等待警告的功能。然后我希望所有最后的方法在运行时运行等待。因为就像 sendtodatabase 需要在它之前执行的方法的 dt 。
在这种情况下,我的控制台应用程序执行以下操作:Program.cs 中的 Main 调用启动方法,启动调用 datapoller 方法,datapoller 调用处理程序方法,处理程序调用 getstuff 方法。datapoller中的方法是一个事件,Timer.Elapsed += DataPollerOnElapsed; 这不能设置为异步......它位于层次结构的中间。
我该如何解决这个问题?
解决方案
不需要 Task.Run ,因为您只是在包装已经返回任务的东西。
public async Task StartupAsync()
{
Console.WriteLine("Fetchstuff1");
var aTask = GetStuff1Async();
Console.WriteLine("Fetchstuff1stuff2");
var bTask = GetStuff2Async();
Console.WriteLine("Fetchstuff1stuff3");
var cTask = GetStuff3Async();
await Task.WhenAll(aTask, bTask, cTask);
// DO STUFF AFTER ALL TASK OVER IS DONE
var categories = GetCategories();
var dt= CreateDatable();
Sendtodatabase();
}
推荐阅读
- algorithm - bestSum - 动态规划
- nginx - 我无法获得 Ingress 服务正常工作的基本示例
- opencv - 分离图像中的四边形
- python-multiprocessing - 使用 zmq 在多个进程之间进行通信
- c# - 如何在脚本中“复制世界放置”?
- excel - 将 http 获取请求图像转换为 Excel ActiveSheet.Pictures
- c - 为什么 valgrind 给我的内存泄漏错误的行位置?
- forms - windows.forms 和重绘位图
- reactjs - 在 React 中渲染 STL 文件
- swift - Empty() 发布者不发送完成