1

従来の ASP.NET Web ページに非同期呼び出しを実装しようとしています。

ここで見つけた指示に従っていますが、非同期で呼び出すことができますが、リクエストがタイムアウトしたときに非同期メソッドの実行をキャンセルする方法がわかりません (これは、私の実行を一時停止することで簡単に行うことができます)ブレークポイントでのコード)。

これまでの私のコードは次のとおりです。

  protected void Button_Click(object sender, EventArgs e)
    {
        PageAsyncTask task = new PageAsyncTask(OnBegin, OnEnd, OnTimeout, null);
        Page.RegisterAsyncTask(task);
        Page.AsyncTimeout = new TimeSpan(0, 0, 10);
        Page.ExecuteRegisteredAsyncTasks();
    }

    protected delegate void AsyncTaskDelegate();
    private AsyncTaskDelegate _dlgt;


    public IAsyncResult OnBegin(object sender, EventArgs e, AsyncCallback cb, object extraData)
    {
        _dlgt = new AsyncTaskDelegate(ExecuteAsyncTask);

        IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
        return result;
    }


    public void OnEnd(IAsyncResult ar)
    {
        _dlgt.EndInvoke(ar);
    }

    private void ExecuteAsyncTask()
    {
        MyObject obj = new MyObject();
        var task = obj.CompleteAsync();
        if (obj.Complete())
        {
            LabelResult.Text = "Success";
        }
        else
        {
            LabelResult.Text = "Failed";
        }
    }

    public void OnTimeout(IAsyncResult ar)
    {
        _dlgt.EndInvoke(ar);//this does not work!
    }

私が抱えている主な問題は、外部サービスを呼び出しているため、非同期メソッドの特定の時点でコードが「ハング」し、特定の状況で応答を停止する可能性があることです。

リクエストを EndInvoke しようとしても、非同期コードは引き続き実行されます。

どんな助けでも大歓迎です。

4

1 に答える 1

1

わかりましたので、解決しました。これは、キャンセル トークンに関係しています。

  1. まず、CancellationTokenSource を作成しました。

private System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();

  1. 次に、これを Task ファクトリに渡し、非同期タスクを開始します。

var task = System.Threading.Tasks.Task.Factory.StartNew(() => myObject.AsyncMethod(Request.QueryString, tokenSource.Token), tokenSource.Token);

  1. 最後に、タイムアウトが発生したら、これを簡単に実行します。

    public void OnTimeout(IAsyncResult ar) { tokenSource.Cancel(); tokenSource.Token.ThrowIfCancellationRequested(); }

ほら!

これにより、キャッチする必要がある例外が発生しますが、少なくともこれにより、コードの実行が停止します。

于 2015-10-23T00:52:54.873 に答える