那么在C#中有几种方法可以做到这一点
我个人建议你尝试无扩展
http://msdn.microsoft.com/en-us/data/gg577609.aspx
实际上,你可以做这样的事情:
https://stackoverflow.com/a/10804404/1268570
我创造了这个给你,这是很容易的,虽然它不是线程安全的,但是这将是一个很好的起点
在形式
var a = Observable.Start(() => Thread.Sleep(8000)).StartAsync(CancellationToken.None);
var b = Observable.Start(() => Thread.Sleep(15000)).StartAsync(CancellationToken.None);
var c = Observable.Start(() => Thread.Sleep(3000)).StartAsync(CancellationToken.None);
Manager.Add("a", a.ObserveOn(this).Subscribe(x => MessageBox.Show("a done")));
Manager.Add("b", b.ObserveOn(this).Subscribe(x => MessageBox.Show("b done")));
Manager.Add("c", c.ObserveOn(this).Subscribe(x => MessageBox.Show("c done")));
private void button1_Click(object sender, EventArgs e)
{
Manager.Cancel("b");
}
管理器实用
public static class Manager
{
private static IDictionary<string, IDisposable> runningOperations;
static Manager()
{
runningOperations = new Dictionary<string, IDisposable>();
}
public static void Add(string key, IDisposable runningOperation)
{
if (runningOperations.ContainsKey(key))
{
throw new ArgumentOutOfRangeException("key");
}
runningOperations.Add(key, runningOperation);
}
public static void Cancel(string key)
{
IDisposable value = null;
if (runningOperations.TryGetValue(key, out value))
{
value.Dispose();
runningOperations.Remove(key);
}
}
BackgroundWorker可以工作,但是对于使用异步操作有一些巨大的缺点。处理多个任务比较困难(即:在所有任务完成时运行某些任务)。 –
是的。另一方面,任务进度报告比BackgroundWorker更难。 – dtb
我不同意 - 如果您从UI上下文中创建TaskScheduler,则报告可能更容易,因为您不必将要报告的信息映射到传递给ReportProgress事件的信息。 “报告”只是安排另一项任务。 –