所以我有一个正在检索网络信息的应用。获取此信息后,我需要处理返回的对象(A JSON字符串)。 但是,据我所知,我的程序一直在等待Web信息等待,它跳转到下一个处理阶段,没有数据要处理,因此中断。 我该怎么办呢?
这是异步方法
async private Task GetInformation(string url)
{
client = new HttpClient();
response = await client.GetAsync(new Uri(url));
result = await response.Content.ReadAsStringAsync();
}
如下所述,我应该等待我调用GetInformation的位置,但是,该方法用于将字符串返回到另一个类,如此
public string GetResult(string url)
{
GetInformation(url);
return result;
}
我该如何解决这个问题?
感谢您的帮助
答案 0 :(得分:3)
您致电GetInformation(url)
的地方还必须拥有await
关键字:
// stage1
//... some code ...
// stage2
await GetInformation(url);
// stage3
//... some code ...
如果没有await
,您的方法会启动下载,但它会与第3阶段并行运行。
当您无法创建该方法await
时,async
的替代方法是在另一个线程中启动该任务并等待该线程完成:
Task.Run(() => GetInformation(url)).RunSynchronously(); // use .Result if you have Task<T>
如果您的代码未在UI线程上运行,则可以跳过 Task.Run()
- 然后只需调用GetInformation(url).RunSynchronously()
。如果它确实在UI线程上运行,那么没有Task.Run
就会导致死锁。
您的第三个选择是使用ManualResetEvent
之类的锁定机制。如果以前的方法不起作用,请使用此类查找样本。
答案 1 :(得分:1)
使用以下代码
private async Task<string> GetInformation(string url)
{
client = new HttpClient();
response = await client.GetAsync(new Uri(url));
return await response.Content.ReadAsStringAsync();
}
使用如下:
var task = GetInformation(url);
DoSomeStuffInParallelWithDownload();
var result = task.Result;
UseDownloadResult(result);