[英]Multiple Asynchronous Task execution
請多多包涵 :-)
我正在努力解決c#中的TPL問題,並試圖找出設計解決方案的最佳方法,以啟動多個異步任務,等待它們完成並繼續前進。 我最初的POC在下面。 每個IDataGatherer實例都需要獲取數據並將其按摩到DataObject實例中。
我不確定如何處理DownloadStringTaskAsync調用的延續,這樣我就可以獲取結果並將其按下到DataObject中。 ContinueWith希望提供一個帶有void返回簽名的方法,但我覺得ExtractData方法需要返回一個Task實例,否則我沒有從GetDataAsync()方法返回的Task實例。
我也想知道是否需要在我的IDataGatherer實例中引入TaskCompletionSource,但是如何將其與正在進行實際工作的任務相關聯 - 例如,DownloadstringTaskAsync和ExtractData?
interface IDataGatherer
{
Task<DataObject> GetDataAsync();
}
class DataObject
{
public string Data { get; set; }
}
class IpGatherer : IDataGatherer
{
private readonly string _url = "http://ip.jsontest.com";
public Task<DataObject> GetDataAsync()
{
var tcs = new TaskCompletionSource<DataObject>(); // Do I need this???
var client = new WebClient();
// stuck here
var task = client.DownloadStringTaskAsync(_url).ContinueWith(ExtractData);
}
private void ExtractData(Task<string> obj)
{
}
}
class Program
{
private static void Main(string[] args)
{
// takes a list of IDataGatherers and waits for them
// all to complete, handles exceptions, etc.
}
}
以這種方式設計解決方案可能會使事情變得過於復雜,因此我願意提出清理建議或更簡潔地完成任務的建議。
我正在使用.NET 4.5
首先,您不需要TaskCompletionSource
。 這是因為可以為ContinueWith()
提供具有非void
簽名的方法。 例如:
public Task<DataObject> GetDataAsync()
{
var client = new WebClient();
return client.DownloadStringTaskAsync(_url)
.ContinueWith((Func<Task<string>, DataObject>)ExtractData);
}
private DataObject ExtractData(Task<string> task)
{
return new DataObject(task.Result);
}
(使用Result
不會阻止,因為您可以確定此時將完成Task
。)
但是,由於您使用的是DownloadStringTaskAsync()
,因此您可能使用.Net 4.5,這意味着您可以使用await
。 這使代碼更簡單:
public async Task<DataObject> GetDataAsync()
{
var client = new WebClient();
var s = await client.DownloadStringTaskAsync(_url);
return ExtractData(s);
}
private DataObject ExtractData(string s)
{
return new DataObject(s);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.