簡體   English   中英

PageAsyncTask超時-如何停止執行異步代碼

[英]PageAsyncTask Timeout - How to stop execution of async code

我正在嘗試在經典的ASP.NET網頁中實現異步調用。

我正在按照我在這里找到的說明進行操作,我可以讓它異步調用,但是我不知道如何在請求超時時取消異步方法的執行(我可以通過暫停執行來輕松地做到這一點代碼在斷點處)。

到目前為止,我的代碼如下:

  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請求,異步代碼仍然會運行。

任何幫助,將不勝感激。

好,所以我已經解決了。 它與取消令牌有關

  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(); }

瞧!

這將導致您隨后需要捕獲的異常,但至少這會停止執行任何代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM