2014-12-01 184 views
1

我想做非阻塞的GET和POST请求。我已经设法用BackgroundWorker来解决它,但我需要你的帮助才能使用任务来实现它。WebClient GET/POST没有阻止UI

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"); 
+0

你没有编译的例子。 Post方法的第一个参数是Uri,但是您要传递一个字符串。 – Zack 2014-12-01 22:46:36

+0

@Zack这只是让你一个想法。创建一个新的Uri(str)' – filur 2014-12-01 22:47:13

+0

如果你想让任何人花时间去帮助你,你需要付出一些努力去创造一个很好的例子。 :\ – Zack 2014-12-01 22:48:22

回答

0

您可以使用await Task.Run()

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

例如:

Post()功能,可以补充一点:

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

,并在“获取()”功能,可以补充一点:

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"); }); 
} 

希望这会有所帮助。这真的很短,很甜。

+0

这看起来很乱,尤其是当有一个HttpClient已经探测到异步。 – mason 2014-12-05 20:56:59

+0

它下载异步,但它不会阻止其他代码阻止UI线程。他没有发布该代码,它可能会做很多其他的事情。这解决了它。 – 2014-12-05 20:58:24

+1

是的,但它*杂乱*。绝对不会将它归类为简短和甜蜜。如果你知道HttpClient的做法,并更新你的答案来表明,相反,我会给你一个upvote! – mason 2014-12-05 20:59:44

-1

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

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

您还可以安装Microsoft HttpClient library,这已经是铅垂的异步调用,也可以是小,重量更轻。

+0

嘿!我知道,但我完全忘了它!你说得对,与你的方法相比,我的方法肯定是混乱的。 +1 – 2014-12-05 21:22:06