我有,我必須電話的異步方法同步,並且就這樣做如下的情況:內存泄漏做異步當在同步
obj.asyncMethod().Wait(myCancelToken)
如果取消令牌切換即使通過使用聲明激活,該任務內的一次性內容也不會被丟棄。
下面的程序說明了問題:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace LeakTest {
class Program {
static void Main(string[] args) {
try {
var timeout = new CancellationTokenSource(TimeSpan.FromMilliseconds(100));
LongRunningTask().Wait(timeout.Token);
} catch (OperationCanceledException error) {
// handling timeout is logically okay, but expect nothing to be leaked
}
Console.WriteLine("Leaked Instances = {0}", DisposableResource.Instances);
Console.ReadKey();
}
static async Task LongRunningTask() {
using (var resource = new DisposableResource()) {
await Task.Run(() => Thread.Sleep(1000));
}
}
public class DisposableResource : IDisposable {
public static int Instances = 0;
public DisposableResource() {
Instances++;
}
public void Dispose() {
Instances--;
}
}
}
}
似乎等待方法只殺死任務線程取消,而不是觸發該線程內的異常,並讓它自然終止。問題是爲什麼?
好的,我看到只有等待被取消。對我來說問題是外部範圍*取決於所有內部示波器在可以處置之前完全處置。如果外部範圍等待隨後取消的任務(即等待恢復但任務仍然自行運行),則這顯然不會發生。 –