如何从Void类调用异步Task函数?
假设我是这样建立的,
我想同步调用Run()中的方法,但要在DoSomeStuffAsync和DoSomeStuffAsync 2中调用 它需要对具有异步等待功能的某些功能进行等待。
我的问题是,如何在DoTask1中进行操作,例如使任务运行同步?像现在一样,这些任务只是启动它,而不会等到完全完成。
static void Main(string[] args)
{
Run();
}
public void Run()
{
DoTask1();
DoTask2();
}
public void DoTask1()
{
var tasks = Task.Run(async () =>
{
await DoSomeStuffAsync();
await DoSomeStuffAsync2();
});
Task.WaitAll(tasks);
}
public void DoTask2()
{
var tasks = Task.Run(async () =>
{
await DoSomeStuffAsync();
await DoSomeStuffAsync2();
});
Task.WaitAll(tasks);
}
private async Task DoSomeStuffAsync(int daysBack)
{
try
{
var data= await GetData();
var objj = GenerateObjects();
await InsertToDb(objj ));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private async Task DoSomeStuffAsync2(int daysBack)
{
try
{
var data= await GetOtherData();
var objj = GenerateObjects();
await InsertToDb(objj ));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
答案 0 :(得分:1)
控制台应用程序的静态void Main()正在调用Run()函数。
您有两种选择。对于以下两个选项,您都应首先使Run
方法正确异步(即async Task
)。
如果这是一个.NET Core项目,则选项A将使Main
成为async Task
方法。然后,您可以使用async all the way。
如果没有,那么您可以进行单个阻止呼叫。我建议您将其放入您的Main
方法中,如下所示:
static void Main()
{
Run().GetAwaiter().GetResult();
}
答案 1 :(得分:-2)
异步void是一个不好的选择,它会生成编译器警告,如果未捕获到异常,则您的应用程序已死,您可能没有合适的调用堆栈来进行调试。但是如果您愿意,您已经有了解决方案 直接调用异步任务方法。并将其包装在异常捕获器中
static void Main(string[] args)
{
Task callTask = Task.Run(() => Run());
callTask.Wait();
}
public async Task Run()
{
await DoSomeStuffAsync();
}