C#异步方法打破了应用程序

时间:2013-11-12 12:00:08

标签: c# windows asynchronous methods web

所以我有一个正在检索网络信息的应用。获取此信息后,我需要处理返回的对象(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;
    }

我该如何解决这个问题?

感谢您的帮助

2 个答案:

答案 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);