PageAsyncTask超时 - 如何停止执行异步代码

时间:2015-10-23 00:19:36

标签: c# asp.net asynchronous pageasynctask

我试图在经典的ASP.NET网页中实现异步调用。

我按照我发现here的说明操作,我可以让它异步调用,但我不知道如何在请求时取消执行async方法超时(我可以通过暂停在断点处执行代码来轻松完成)。

到目前为止我的代码如下:

  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 个答案:

答案 0 :(得分:1)

好的,我已经解决了。它与cancellation tokens有关。

  1. 首先我创建了一个CancellationTokenSource:
  2. private System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();

    1. 然后我将其传递给任务工厂以启动异步任务:
    2. 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(); }

      2. 瞧!

        这会导致您需要捕获的异常,但至少会停止执行任何代码。