Chr*_*spy 7 c# asynchronous task multitasking
我在找到如何在C#中取消此任务时遇到了一些问题.我对处理线程没有很强的理解,我尝试使用谷歌搜索一些简单的代码示例来帮助我,但我真的没有在哪里.这是我正在处理的一段代码:
var tasks = urls.Select(url => Task.Factory.StartNew(
state =>
{
using (var client = new WebClient())
{
lock (this)
{
// code to download stuff from URL
}
}
}, url)).ToArray();
try
{
Task.WaitAll(tasks);
}
catch (Exception e)
{
textBox2.AppendText("Error: " + e.ToString());
}
Run Code Online (Sandbox Code Playgroud)
其中"urls"是一个URL数组.是否有一种简单的方法可以使我在单击程序中的按钮时完全停止下载URL?另外,我粘贴的代码片段在backgroundWorker1调用的函数中,我想这可能会使事情变得复杂一些.(我有一个backgroundWorker的原因是UI在下载URL时没有锁定.)
如果这有点令人困惑,这里是我试图用我的代码实现的概述:
提前致谢.
不知道这是否是正确的方法,但我已经能够使用以下代码取消任务。我已经创建了一个表单ListBox,ProgressBar因此我正在引发和处理ProgressChanged的事件BackgroundWorker。希望这能以某种方式帮助您。
void bw_DoWork(object sender, DoWorkEventArgs e)
{
CancellationTokenSource _tokenSource = new CancellationTokenSource();
CancellationToken _token = _tokenSource.Token;
var urls = e.Argument as IEnumerable<string>;
_token = new CancellationToken();
if (urls == null) return;
var i = 0;
var a = 100 / urls.Count();
var sb = new StringBuilder();
var t = urls.Select(url => Task.Factory.StartNew(
(u) =>{
using (var wc = new WebClient())
{
lock (this){
var s = wc.DownloadString(u.ToString());
sb.AppendFormat("{1}:{0}\r\n", "", u);
}
}
if (Worker.CancellationPending){
//MAGIC HAPPENS HERE, IF BackgroundWorker IS REQUESTED
//TO CANCEL, WE CANCEL CancellationTokenSource
_tokenSource.Cancel();
}
//IF CANCELATION REQUESTED VIA CancellationTokenSource
//THROW EXCEPTION WHICH WILL ADD TO AggreegateException
_token.ThrowIfCancellationRequested();
//YOU CAN IGNORE FOLLOWING 2 LINES
i += a;
Worker.ReportProgress(i, u);
}, url, _token)).ToArray();
try
{
Task.WaitAll(t);
}
catch (AggregateException age)
{
if (age.InnerException is OperationCanceledException)
sb.Append("Task canceled");
}
catch (Exception ex)
{
sb.Append(ex.Message);
}
e.Result = sb;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |