[英]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.