2017-08-11 62 views
1

我有一個Async方法,在我關閉其用戶控件後不會立即結束。所以,當我關閉並重新打開它時,我的用戶控件會出錯。我怎麼能退出另一個班級的Async功能。那可能嗎?如何從另一個類中退出異步函數

Public Class Main  
    Private Sub mainfucn() 
     'exit otherfunc 
    End Sub 
End Class 

Public Class Other 
    Public Async Function otherfunc() As Task 
     ' some code 
    End Sub 
End Class 
+1

我真的不明白你想要做什麼......你可以添加一些關於你實際上想要做什麼的更多信息嗎? (最好不要超過7個單詞和一個沒有任何進一步解釋的非編譯代碼片段......) – bassfader

+0

在你的例子中,調用'otherfunc'方法是什麼?它是否在'mainfucn' [sic]方法的不同線程上執行? –

+0

@bassfader你是對的!我編輯了這個問題,所以我希望現在可以清除。 – vicangel

回答

2

那麼,你可以通過自己實施你自己的取消系統來癱瘓它。舉例來說,可能做這樣的事情,這將是與某種解除標誌性,這樣最簡單的方法:

Public Class Main  
    Private _other As New Other() 

    Private Sub MainFunc() 
     other.Cancelled = True 
    End Sub 
End Class 

Public Class Other 
    Public Property Cancelled As Boolean ' Yes, I know I'm not British, but the American spelling of "Canceled" is phonetically stupid. But, then again, so is the spelling of "British", so... 

    Public Async Function OtherFunc() As Task 
     Cancelled = False 
     While Not Cancelled 
      ' Some code 
     End While 
    End Sub 
End Class 

但是,那將是非常可怕的,所以我不會推薦它。可怕的兩個主要原因是因爲,一個,它假定只有一個Async方法,並且一次只運行一次它的調用。和兩個,它與.NET的標準異步取消模式不一致。

我強烈建議您不要試圖用自己的(反)模式來做,而應該在您的Async函數中添加一個CancellationToken參數。然而,你在方法中實現它的方式完全取決於它在異步做什麼以及它是如何做的。因此,如何實現這一目標是不可能的。我能說的最好的事情是,你使用CancellationToken正確的軌道,所以你應該繼續沿着這條路走下去。如果在進行了更多研究之後,您無法使其工作,那麼我會建議發佈一個更具體的問題,關於如何在您的方法正在執行的內容以及它的運作方式中實施CancellationToken

+0

非常感謝你! – vicangel

相關問題