2014-12-01 176 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