簡體   English   中英

Service Fabric 中的取消令牌使用情況

[英]Cancellation Token usage in Service fabric

我創建了一個 Service Fabric 應用程序。 RunAsync() 方法中有一個長期運行的作業,例如“將數百萬條記錄從數據庫遷移到 ServiceFabric 字典的 LoadData()”。

根據 MSDN 文檔,想要實現在服務啟動時運行的后台任務的服務應使用其邏輯“RunAsync(CancellationToken)”覆蓋此方法

取消令牌用於監視取消請求,它存在於 RunAsync() 並關閉服務。 所以我在我的項目中使用了 CancellationToken。

這是我的代碼

RunAsync (System.Threading.CancellationToken cancellationToken);
{
 LoadData(CancellationToken);
}
Async Task LoadData(CancellationToken)
{
 Method1(CancellationToken) -- Aync call
 Method2() -- Normal call
 Method3() -- Normal call
}

正如你所看到的,我有 Method1,它是一個異步調用,它作為一個單獨的線程運行,因此相同的令牌被傳遞給這個方法,因為主線程不會知道子線程。 但是,Method2 和 Method3 只是函數調用,所以 CancellationToken 沒有被傳遞,因為它們是在主線程的上下文中運行的。

我有幾個關於 Service Fabric 中 CancellationToken 使用的問題。 1. 我們是否需要為從長時間運行的方法(異步/同步)調用的所有方法傳遞 CancellationToken? 2. 我處理 CancellationToken 的方式是正確的還是需要修改什么?

我們是否需要為從長時間運行的方法(異步/同步)調用的所有方法傳遞 CancellationToken?

是的,如果你能夠尊重它。 如果它不對它做任何事情,那么將它傳遞給一個方法是沒有意義的。

我處理 CancellationToken 的方式是正確的還是我需要修改什么?

很難說,我們需要知道你的代碼是做什么的。

如果服務要關閉,它將使用 CancellationToken 取消任何待處理的工作。 如果您有任何接受 CancellationToken 的異步調用,則應將其傳遞給該方法,以便在請求取消時退出。

如果您有其他一些方法,例如Method1()並且它做了一些長時間運行的工作,您仍然可以在使用CancellationToken.IsCancellationRequestedCancellationToken.ThrowIfCancellationRequested請求取消時退出。 如果請求取消,后者將拋出OperationCanceledException

例如,您可以這樣做:

public void Method1(CancellationToken cancellationToken)
{
    // some work

    if(cancellationToken.IsCancellationRequested)
        return;

    // some more work

    if (cancellationToken.IsCancellationRequested)
        return;

    // some more work
}

由您決定該方法是否有一些邏輯點來檢查取消,或者該方法是否如此之快以至於不會產生太大影響。

順便說一句,這不是特定於服務結構的,您可以在此處找到更多文檔。

暫無
暫無

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

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