我正在玩这些Windows 8 WinRT任务,我正在尝试使用下面的方法取消任务,并且它在某种程度上起作用.CancelNotification方法被调用,这使您认为任务已被取消,但在后台任务继续运行,然后在完成后,任务的状态始终完成且永不取消.有没有办法在取消任务时完全停止?
private async void TryTask()
{
CancellationTokenSource source = new CancellationTokenSource();
source.Token.Register(CancelNotification);
source.CancelAfter(TimeSpan.FromSeconds(1));
var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);
await task;
if (task.IsCompleted)
{
MessageDialog md = new MessageDialog(task.Result.ToString());
await md.ShowAsync();
}
else
{
MessageDialog md = new MessageDialog("Uncompleted");
await md.ShowAsync();
}
}
private int slowFunc(int a, int b)
{
string someString = string.Empty;
for (int i = 0; i < 200000; i++)
{
someString += "a";
}
return a + b;
}
private void CancelNotification() …Run Code Online (Sandbox Code Playgroud) 我有一个与外部资源交互的 ASP.NET MVC 应用程序,并且有一个操作需要很多时间。所以在控制器中我有这样的方法
[HttpPost]
public async Task<JsonResult> SomeMethod(..., CancellationToken token)
{
await _someService.ExecuteSlowOperationAsync(..., token);
...
}
Run Code Online (Sandbox Code Playgroud)
这个缓慢的操作看起来像
public async Task ExecuteSlowOperationAsync(..., CancellationToken token)
{
return await Task.Run(() =>
{
//interacting with external resource
}, token);
}
Run Code Online (Sandbox Code Playgroud)
此方法与模态视图相关联,如果请求将花费太多时间,用户可能会决定关闭它。据此,我必须在不等待结果的情况下取消请求,因此在客户端我有类似的代码
...
var request = $.ajax(...);
...
$('#modal').on('hidden.bs.modal', function () {
request.abort();
});
Run Code Online (Sandbox Code Playgroud)
如果我正确理解这篇文章,取消令牌通过框架模型绑定器与请求绑定,无需对其进行任何操作。当用户关闭模态表单时,在浏览器控制台中,我可以看到请求状态“已取消”,但在服务器端缓慢的操作仍在执行。Aslo我试过
CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken);
Run Code Online (Sandbox Code Playgroud)
然后从这个来源拿了令牌,但还是一无所获。
我觉得我错过了一些重要的事情并且对这种情况有误解。任何想法如何使它工作?
c# asp.net-mvc asp.net-ajax task-parallel-library cancellation