WebClient GET / POST没有阻止UI

时间:2014-12-01 22:29:55

标签: c# winforms asynchronous

我想制作非阻塞的GET和POST请求。我已设法用BackgroundWorker来解决它,但我需要你的帮助才能使用任务来实现它。

public Task<string> Post(Uri uri, string data)
{
    return _webClient.UploadStringTaskAsync(uri, data);
}

public Task<string> Get(Uri uri)
{
    return _webClient.DownloadStringTaskAsync(uri);
}

我需要按顺序运行请求。实现这个的正确方法是什么?标记asyncawait的方法?使用Task.WaitAll()等待每项任务?

我所追求的一个例子:

Task<string> loginTask = Post("login", data);
// wait for webrequest to complete and make use of response string

// use data from first request in a new request:
Task<string> someOtherRequest = Get("details");

2 个答案:

答案 0 :(得分:0)

您可以使用await Task.Run()

await Task.Run(()=> { Run_UI_Blocking_Function(); });

例如:

Post()功能中,您可以添加以下内容:

await Task.Run(()=> { PostString = Post(new Uri("url"), "data"); }); 

在&#39; Get()&#39;功能,您可以添加:

await Task.Run(()=> { GetString = Get(new Uri("url")); }); 

您只需要将async添加到您的通话功能中即可。这是一个完整的例子:

private async void btn_PostData_Click(object sender, EventArgs e)
{
    await Task.Run(()=> { PostString = Post(new Uri("url"), "data"); }); 
}

希望这会有所帮助。它真的很短而且很甜蜜。

答案 1 :(得分:-1)

您需要将方法标记为异步,并等待结果。

public async Task<string> Get(Uri uri)
        {
        return await _webClient.DownloadStringTaskAsync(uri);
        }

你也可以安装Microsoft HttpClient library,它已经被用于异步调用,并且可能重量轻一点。