我是C#中async / await的新手。这就是我想要做的事情:
private async Task LoadSomeData()
{
/*
*This is where the 'Data' is loaded with HTTP
*/
//Data loading finished. Need to return control to next line from caller function and use this 'Data'
// Also need to use 'Data' to load 'Data2' over HTTP but is not very important
// and hence can be run in background. No piece of code depends on this currently.
}
private async void UIEventHandler()
{
//await until 'Data2' has loaded
//Continue handling the event after Data2 is loaded
}
我的问题是,我该如何实现上述操作。检索Data2后我不想从LoadSomeData()
方法返回,因为当前操作不依赖于它。
答案 0 :(得分:1)
下面是一些关于你的方法名称的快速代码。为方便起见,我将它们制作成静态。
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Console.WriteLine("Main Start");
UIEventHandler(2000);
UIEventHandler(500);
UIEventHandler(1000);
Console.WriteLine("Main Stop");
Thread.Sleep(3000); // wait for tasks to finish
}
private static async Task LoadSomeData(int delay)
{
await Task.Run(() =>
{
Console.WriteLine("Start (LoadSomeData) " + delay);
Thread.Sleep(delay);
Console.WriteLine("Stop (LoadSomeData) " + delay);
});
}
private static async Task UIEventHandler(int delay)
{
Console.WriteLine("Start (UIEventHandler) " + delay);
await LoadSomeData(delay);
Console.WriteLine("Stop (UIEventHandler) " + delay);
}
}
这是测试运行的示例输出:
Main Start
Start (UIEventHandler) 2000
Start (LoadSomeData) 2000
Start (UIEventHandler) 500
Start (UIEventHandler) 1000
Main Stop
Start (LoadSomeData) 500
Start (LoadSomeData) 1000
Stop (LoadSomeData) 500
Stop (UIEventHandler) 500
Stop (LoadSomeData) 1000
Stop (UIEventHandler) 1000
Stop (LoadSomeData) 2000
Stop (UIEventHandler) 2000
您会注意到,对UIEventHandler
的每次通话都显示了它的开始"开始"直接消息。然而,"停止"在完成对LoadSomeData
的相应调用之前,不会显示该消息。 await
运算符实际上是告诉UIEventHandler
中的代码停止,直到被调用方法中的任务完成为止。
答案 1 :(得分:-1)
private async Task LoadSomeData()
{
var data = await Task.Delay(1000); // Replace with your HTTP GET
return data;
}
private async Task LoadSomeData2(Data data)
{
var data2 = await Task.Delay(1000); // Replace with your other HTTP GET
return data2;
}
private async void UIEventHandler()
{
var data = await LoadSomeData();
var data2 = await LoadSomeData2(data);
}
<强>更新强>: 我建议你阅读Async/Await - Best Practices in Asynchronous Programming