0

同期タスクのキャンセルを行う方法を探しています。次のようなタスクがあります。

public Task AddAsync(CancellationToken cancellationToken)
{
    Task result = Task.Factory.StartNew(() =>
    {
        // So wait forever
        var wait = new ManualResetEvent(false);
        var waitIndex = WaitHandle.WaitAny(new[] { wait,
            cancellationToken.WaitHandle});

        switch (waitIndex)
        {
            case 0:
                Debug.WriteLine("Everything fine");
                break;
            case 1:
                Debug.WriteLine("Cancelled");
                Thread.Sleep(5000);
                cancellationToken.ThrowIfCancellationRequested();
                break;
        }
        return;
    }, cancellationToken);

    return result;
}

非同期メソッドは次のように呼び出されます。

var ts = new CancellationTokenSource();
var t = AddAsync(ts.Token);
if (!t.Wait(TimeSpan.FromSeconds(5)))
{
    ts.Cancel();
}

したがって、タイムアウト後にキャンセルを呼び出しますが、タスクのキャンセルに時間がかかります。では、どうすれば同期キャンセル呼び出しを行うことができますか?

4

0 に答える 0