请多多包涵:-)多个异步任务执行
我与TPL在C#中挣扎,我坚持试图找出设计的开球多个异步任务的解决方案的最佳方式,等待他们完成并继续前进。我最初的POC在下面。每个IDataGatherer实例都需要获取数据并将其按摩到一个DataObject实例中。
我不确定如何处理从DownloadStringTaskAsync电话,这样我可以把结果和按摩到一个数据对象的延续。 ContinueWith想要提供一个带void返回签名的方法,但我觉得ExtractData方法需要返回一个Task实例,否则我没有一个Task实例从GetDataAsync()方法返回。
我也想知道如果我需要在我的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
什么版本的.NET? 4.0或4.5? – 2013-02-26 20:30:39