3

.net での非同期プログラミングに関するいくつかのテストを開始していますが、今は cancelToken を使用して長い操作をキャンセルしようとしています。

だから私は次のコードを持っています:

CancellationTokenSource cancelationToken = new CancellationTokenSource();

操作を開始するためのマイ ボタン

    private void button2_Click(object sender, EventArgs e)
    {
        cancelationToken.Cancel(true);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        StartOperation(cancelationToken.Token);
    }

そして最後に私の操作

    private async void StartOperation(CancellationToken cancelToken)
    {
        await GetItensFromDatabase2(cancelToken);
    }

    public static Task<int> GetItensFromDatabase(CancellationToken cancelToken)
    {
        //cancelToken.Register( () => Console.WriteLine("Canceled") );
        return Task.Factory.StartNew<int>(() =>
        {
            int result = 0;

            cancelToken.ThrowIfCancellationRequested();

            result = MyLongOperation();  // Simulates my operation -> I want to cancel while this operation is still running

            return result;

        }, cancelToken);
    }

では、MyLongOperation() メソッドをキャンセルする方法は? することは可能ですか?

4

2 に答える 2

5

任意の時点でキャンセルすることはできません。CancellationToken の目的は、長時間実行されている操作で次のことが予想される場合に、ユーザーが操作をキャンセルできるようにすることです...

while(!finished)
{
     cancelToken.ThrowIfCancellationRequested();
     //Some not cancelable operations
}

キャンセル可能なメソッドのより一般的な方法は次のとおりです

private static void LongRunning(CancellationToken cancelToken)
{
    while (true)
    {
        if(cancelToken.IsCancellationRequested)
        {
            return;
        }
        //Not canceled, continue to work
    }
}

アイデアは、ユーザーがキャンセルを要求するということですが、エグゼキュータだけが自分の作業をいつ停止するかを決定します。通常、エグゼキュータは何らかの「セーフポイント」に到達した後にキャンセルを行います

Abort意見を求めずに長時間実行する操作は良い経験ではありません。これについては多くの投稿が書かれています。

于 2014-01-15T10:24:03.133 に答える
1

まず、「cancelToken.ThrowIfCancellationRequested」というロジックを既に実行してからキャンセルするという問題があります。「MyLongOperation」は、タスクがキャンセルされたことをどのように認識しますか? :)

通常、実行時間の長いタスクをキャンセルすると、CancellationToken が引数として取り込まれるため、コードは次のようになります。

// Check if cancelled
// do work part 1
// Check if cancelled
// do work part 2

キャンセル可能な操作の粒度は、開発者次第です。

于 2014-01-15T10:29:43.197 に答える