public
class
AsyncTask
{
public
void
TestMethod()
{
List<
string
> Listone =
new
List<
string
> {
"
url2
"
,
"
url
"
,
"
urle
"
};
//
var results = from url in Listone.AsParallel()
//
select new WebClient().DownloadData(url);
//
results.ForAll(result=>Userresult(result));
try
{
Listone.RunAsync(url => StartDownload(url), task => FinishDownLoad(task.AsyncState.ToString(), task.Result));
}
catch
(AggregateException problems)
{
var
handers =
new
Dictionary<Type, Action<Exception>>();
handers.Add(
typeof
(Exception),ex=>Console.WriteLine(ex.Message));
if
(!HandleAggregateError(problems, handers))
throw
;
}
}
private
static
bool
HandleAggregateError(AggregateException aggregate,Dictionary<Type,Action<Exception>> exceptionHanders)
{
foreach
(
var
exception
in
aggregate.InnerExceptions)
{
if
(exception
is
AggregateException)
return
HandleAggregateError(exception
as
AggregateException, exceptionHanders);
else
if
(exceptionHanders.ContainsKey(exception.GetType()))
{
exceptionHanders[exception.GetType()](exception);
}
else
return
false
;
}
return
true
;
}
private
void
Userresult(
byte
[] result)
{
return
;
}
private
static
void
FinishDownLoad(
string
url,
byte
[] bytes)
{
Console.WriteLine(
"
Read{0} byes from {1}
"
,bytes.Length,url);
}
private
static
Task<
byte
[]> StartDownload(
string
url)
{
var
tcs =
new
TaskCompletionSource<
byte
[]>(url);
var
wc =
new
WebClient();
wc.DownloadDataCompleted += (sender, e) =>
{
if
(e.UserState == tcs)
{
if
(e.Cancelled)
{
tcs.TrySetCanceled();
}
else
if
(e.Error !=
null
)
{
if
(e.Error
is
WebException)
tcs.TrySetResult(
new
byte
[
0
]);
else
tcs.TrySetException(e.Error);
}
else
tcs.TrySetResult(e.Result);
}
};
wc.DownloadDataAsync(
new
Uri(url),tcs);
return
tcs.Task;
}
}
public
static
class
MyExtenion
{
public
static
void
RunAsync<T, TResult>(
this
IEnumerable<T> taskParms, Func<T, Task<TResult>> tasStarter, Action<Task<TResult>> taskFinisher)
{
taskParms.Select(parm => tasStarter(parm)).AsParallel().ForAll(t => t.ContinueWith(t2 => taskFinisher(t2)));
}
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

