请求取消令牌的任务事件或操作(Task event or action on cancel token requested)
这是我的代码:
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); } } }我想知道如果存在任何方式使用事件(或一些行动),如果取消请求。 我的意思是我需要在_timeout过期的时刻正好执行SomeMethod()。 任何人都可以解释我:一般情况下可以吗?
This is my code:
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); } } }I wonder if exists any way to use event (or some action) if CancellationRequested. I mean that I need to do SomeMethod() exactly in the moment when _timeout Expired. Can anyone explain me: is it possible in general?
最满意答案
您正在寻找CancellationToken.Register :
注册将取消此CancellationToken时将被调用的委托。
注册一个这样的动作:
_cancelToken.Token.Register(() => DoStuff());You're looking for CancellationToken.Register:
Registers a delegate that will be called when this CancellationToken is canceled.
Register an action like this:
_cancelToken.Token.Register(() => DoStuff());更多推荐
发布评论