아래 코드와 같이 작업 계속을 사용하고 있습니다. 문제는 어떤 URL이 실패했는지 알고 싶습니다. 나는 당신이 Bcl.Async 패키지를 사용할 수있는 경우에, 나는 확실히 그것을 추천 해드립니다 t.ISFaulted계속 중에 오류 항목 가져 오기
static void Main(string[] args)
{
var UIContext = TaskScheduler.FromCurrentSynchronizationContext();
var URLsToProcess = new List<string>
{
"http://www.microsoft.com",
"http://www.stackoverflow.com",
"http://www.google.com",
"http://www.apple.com",
"http://www.ebay.com",
"http://www.oracle.com",
"http://www.gmail.com",
"http://www.amazon.com",
"http://www.outlook.com",
"http://www.yahoo.com",
"http://www.amazon124.com",
"http://www.msn.com"
};
string[] tURLs = null;
Task task = Task.Factory.StartNew(() =>
{
tURLs = URLsToProcess
.AsParallel()
.WithDegreeOfParallelism(3)
.Select(uri => DownloadStringAsTask(new Uri(uri)).Result)
.ToArray();
});
task.ContinueWith((t) =>
{
if (t.IsFaulted)
// How to know which URL has failed
}, UIContext});
}
static Task<string> DownloadStringAsTask(Uri address)
{
TaskCompletionSource<string> tcs =
new TaskCompletionSource<string>();
WebClient client = new WebClient();
client.DownloadStringCompleted += (sender, args) =>
{
if (args.Error != null)
tcs.SetException(args.Error);
else if (args.Cancelled)
tcs.SetCanceled();
else
tcs.SetResult(args.Result);
};
client.DownloadStringAsync(address);
return tcs.Task;
}
죄송합니다. 내 대답을 삭제했습니다. 근본적으로 당신의 접근 방식에는 문제가 있습니다. 방금 작성한 코드가 매우 복잡하다는 것을 알았습니다. 해결책이라고 생각했던 것을 묻는 대신 달성하려는 것을 설명하십시오. 나는 도와 주겠다. –
TPL을 사용하여 다양한 URL에서 데이터를 다운로드하고 있습니다. 일단 다운로드가 완료되면 어떤 URL이 실패하고 어떤 URL이 성공했는지 알고 싶습니다. 잘못된 것을 발견하면 제안 해주십시오. – BKS