0

所以我有一个正在检索网络信息的应用程序。获得此信息后,我需要处理返回的对象(一个 JSON 字符串)。但是,据我所知,我的程序不断中断,因为当网络信息正在等待时,它会跳转到下一个处理阶段,该阶段没有要处理的数据,因此会中断。我该如何修复它?

这是异步方法

    async private Task GetInformation(string url)
    {
        client = new HttpClient();

        response = await client.GetAsync(new Uri(url));
        result = await response.Content.ReadAsStringAsync();
    }

如下所述,我应该将 await 放在调用 GetInformation 的位置前面,但是,该方法用于将字符串返回给另一个类,就像这样

    public string GetResult(string url)
    {
        GetInformation(url);
        return result;
    }

我怎样才能解决这个问题?

谢谢你的帮助

4

2 回答 2

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>

Task.Run()如果您的代码不在 UI 线程上运行,则可以跳过 - 然后只需调用GetInformation(url).RunSynchronously(). 如果它确实在 UI 线程上运行,那么Task.Run您就不会冒死锁的风险。

您的第三个选择是使用像ManualResetEvent. 如果以前的方法不起作用,请查找使用此类的示例。

于 2013-11-12T12:02:45.167 回答
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);
于 2013-11-12T12:07:07.537 回答