亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

取消客戶端上長時間運行的操作 cancel

取消客戶端上長時間運行的操作 cancel

C#
臨摹微笑 2023-08-20 10:05:44
我使用 ASP.NET Core 和 Razor Pages 開始了我的第一個項目。根據客戶端請求,將啟動長時間運行的數據庫操作?,F在我想認識到,當用戶離開網站時,可以取消數據庫操作。我已經嘗試過使用cancelToken,但它永遠不會被取消。public async Task<JsonResult> OnPostReadAsync([DataSourceRequest] DataSourceRequest request, CancellationToken cancellationToken){    var messages = await _logMessageService.GetLogMessagesAsync(request, cancellationToken);    return new JsonResult(messages.ToDataSourceResult(request));}該函數由 Telerik Kendo UI 網格調用。你能告訴我,為什么取消令牌沒有被取消,或者我還有什么其他選項來檢測客戶端的墮胎?編輯1我將令牌傳遞給 NpgsqlCommand 的此函數調用:var dataReader = await command.ExecuteReaderAsync(cancellationToken);
查看完整描述

2 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

要取消 IO 綁定(即運行時間較長的任務),您可以執行以下代碼,這些代碼是我從 C# with CLR 書中獲得的。


設計任務的擴展方法如下。


private static async Task<TResult> WithCancellation<TResult>(this Task<TResult> originalTask,

CancellationToken ct) {

   // Create a Task that completes when the CancellationToken is canceled

   var cancelTask = new TaskCompletionSource<Void>();

   // When the CancellationToken is canceled, complete the Task

  using (ct.Register(

     t => ((TaskCompletionSource<Void>)t).TrySetResult(new Void()), cancelTask)) {

    // Create a Task that completes when either the original or

    // CancellationToken Task completes

    Task any = await Task.WhenAny(originalTask, cancelTask.Task);

    // If any Task completes due to CancellationToken, throw OperationCanceledException

     if (any == cancelTask.Task) ct.ThrowIfCancellationRequested();

  }

  // await original task (synchronously); if it failed, awaiting it

  // throws 1st inner exception instead of AggregateException

 return await originalTask;

}

如下面的示例代碼所示,您可以使用上面設計的擴展方法來取消它。


public static async Task Go() {

   // Create a CancellationTokenSource that cancels itself after # milliseconds

   var cts = new CancellationTokenSource(5000); // To cancel sooner, call cts.Cancel()

   var ct = cts.Token;

   try {

    // I used Task.Delay for testing; replace this with another method that returns a Task

     await Task.Delay(10000).WithCancellation(ct);

     Console.WriteLine("Task completed");

   }

   catch (OperationCanceledException) {

    Console.WriteLine("Task cancelled");

  }

}

在此示例中,取消是根據給定時間完成的,但您可以通過調用 cancel 方法來調用取消。


查看完整回答
反對 回復 2023-08-20
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

該問題是 IISExpress 中的錯誤,

我切換到 Kestrel,現在一切都按預期進行。


查看完整回答
反對 回復 2023-08-20
  • 2 回答
  • 0 關注
  • 193 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號