你所想,使并行程序,有一个IO通话为主要方面,所以它能够更好地使用使用TaskCompletionSource
异步编程,因为Webclient
的DownloadAsync
方法返回一个void
。以下是ReadData
修改后的版本:通过async
方法,它可以await
,直到所有的下载调用返回
public Task<string> ReadData(int i)
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
var client = new WebClient();
string uriString = @"http://someforum.com/page?id=" + i;
client.DownloadStringCompleted += (sender,args) =>
{
tcs.TrySetCanceled();
tcs.TrySetException(args.Error);
tcs.TrySetResult(args.Result);
};
client.DownloadStringAsync(new Uri(uriString));
return tcs.Task;
}
调用READDATA异步
你可以最好做到这一点。另外,作为其多个Async
通话中,以便最好设置限制i
,就像你不能检查每个下载和返回的值同步的版本,所有来电都在这种情况下
public async Task<LinkedList<string>> ReadDataAsync()
{
var docs = new LinkedList<string>();
List<Task<string>> taskList = new List<Task<string>>();
for (int i = 0; ; ++i) // Set a limit to i, since you are not running synchronously, so you cannot keep checking which value yields null as result
{
int localId = i;
taskList.Add(ReadData(localId));
}
await Task.WhenAll(taskList);
// Do Link List processing, if the Task is not cancelled and doesn't have an error, then result can be accessed
}
“WebClient”的实例成员不是线程安全的。 –
我编辑了代码。 – user1681317
'LinkedList'也不是线程安全的。 ;) –