那麼在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事件的信息。 「報告」只是安排另一項任務。 –