簡體   English   中英

在C#中取消后如何重新啟動CancellationTokenSource?

[英]How to restart CancellationTokenSource after make it cancel in c#?

我有一個WPF應用程序,正在從WCF服務獲取信號。 因此,一方面,我的應用程序運行良好,並且並行運行,我需要從WCF應用程序獲取響應,因此,如果我將從WCF服務獲得10個響應,則需要取消一個正在等待信號的Task。
因此,整個過程運行良好,但是當我再次啟動該過程時,我又需要啟動幾秒鍾的“任務延遲”,並且第一次使用CancellationTokenSource.Token取消任務。
所以再次嘗試啟動Task.Delay我得到Token.IsCancellationRequested = true 因此,我需要將其設置為false或再次啟動Task.Delay

public static System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();
private void btnSubmit(object sender, RoutedEventArgs e)
{
    if(tokenSource.Token.IsCancellationRequested == true)
    {
        startAddToPosition(tokenSource.Token);
    }
    else
    {
        startAddToPosition(tokenSource.Token);
    }
}

我正在將tokenSource值傳遞給startAddToPosition任務。 因此,如果Token為false,那么我的條件不起作用,因此我需要使tokenSource.Token.IsCancellationRequested == false

public static async void startAddToPosition(System.Threading.CancellationToken token)
{
    try
    {
        MainWindow.isInLoop = true;
        await Task.Delay(30000, token);
        MainWindow.isInLoop = false;
    }
    catch(OperationCanceledException ex)
    {
        MainWindow.isInLoop = false;
    }
}

但是,當startAddToPosition啟動時,並行運行時,我正在等待WCF服務發出的信號持續30秒,如果我在5秒內收到來自WCF服務發出的信號,那么我就不想等待剩余的25秒。 因此,如果我從WCF服務獲得信號,那么我將取消任務以等待更多。

當任務等待30秒時,下面的HandleBroadCast將並行運行。

public static void HandleBroadcast(object sender, EventArgs e)
{
  try
  {
     var eventData = (ServiceReference1.EventDataType)sender;
     if (message != "")
          message += "\r\n";
          message += string.Format("{0} (from {1})",
          eventData.EventMessage, eventData.ClientName);

     if (isInLoop == true)
     {
         tokenSource.Cancel();
     }
  }
  catch (Exception ex)
  {
  }
}

因此,當tokenSource變為cancel時,我將重定向到startAddToPosition方法的catch部分。

因此,這就是整個流程,當我再次單擊“提交”按鈕時,它將轉到startAddToPosition方法,但它的tokenSource值變為true。 那么如何更改tokenSource的值和

如果有更好的主意可以等待30秒並同時從WCF服務獲取響應,並且如果我從WCF服務獲取響應,則需要取消該等待時間。 在執行過程中,我有什么好建議要替換?

您通過創建一個新的“重新啟動” CancellationTokenSource

tokenSource = new System.Threading.CancellationTokenSource();

但是,正如Panagiotis所言,如果您描述要解決的實際問題,可能會有更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM