请求取消令牌的任务事件或操作

Ale*_*der 4 c# task-parallel-library

这是我的代码:

public sealed class ProcessingTask : ProcessingObject
{
    private CancellationTokenSource _cancelToken;    
    private int _timeOut = 10000;

    public int ProcessObjectID { get; private set; }       
    public Task ProcessObjectTask { get; private set; }
    public QueueObject queueObject { private get; set; }
    public ProcessingTask(int processObjectID, Uri url)
        : base(url)
    {           
        this.ProcessObjectID = processObjectID;            
    }

    public void ResetTask()
    {
        _cancelToken = new CancellationTokenSource(_timeOut);            
        ProcessObjectTask = new Task(() => DoTaskWork(), _cancelToken.Token);
    }

    private void DoTaskWork()
    {
        Console.WriteLine("Thread {0} was started...", ProcessObjectID);
        //
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);   // imitate hard process
        HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //  

        response.Dispose();
        //

        // Your logic here
        //queueObject.QueueObjectId - dequeud object is available here
        //
        if (_cancelToken.IsCancellationRequested)
        {
            Console.WriteLine("Thread {0} was timed out...", ProcessObjectID);                
        }
        else
        {
            Console.WriteLine("Thread {0} was finished...", ProcessObjectID);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果CancellationRequested,我想知道是否存在使用事件(或某些操作)的任何方法.我的意思是我需要在_timeout Expired时完全执行SomeMethod().任何人都可以解释一下:一般来说可能吗?

Yuv*_*kov 13

您正在寻找CancellationToken.Register:

注册取消取消取消时将调用的委托.

注册这样的动作:

_cancelToken.Token.Register(() => DoStuff());
Run Code Online (Sandbox Code Playgroud)

  • 直接链接到文档而不是链接到搜索通常更友好,特别是使用非英语文化的(考虑到本网站的英语性质).已修复此时的链接. (2认同)