[英]Reuse same single thread for same task again and again in wpf (c#) application without ThreadPool
單擊按鈕創建MVVM應用程序,其中應用程序要連接到服務器。 單擊按鈕后,將創建一個線程以連接到服務器,以使UI不會凍結並終止(超時為15秒)。 下次單擊該按鈕時,將再次創建新線程以連接到服務器並終止。
但是,第一次,我想創建一個新線程,然后,如果應用程序未關閉並且用戶單擊了同一按鈕,那么我想重用該線程(不是新線程)來執行“連接”任務。
那可能嗎?
下面是代碼:
Class ConnectViewModel:BaseViewModel
{
public void ConnectToServer()
{
ConnectButtonEnable = false;
ConnectingServerText = Properties.Resources.TryingToConnectServer;
Thread thread = new Thread(new ThreadStart(connect));
thread.Start();
thread.Join();
}
public void connect()
{
bool bReturn = false;
UInt32 iCommunicationServer;
bReturn = NativeMethods.CommunicateServer(out iCommunicationServer);
if (!bReturn || NativeMethods.ERROR_SUCCESS != iCommunicationServer)
{
ConnectingServerText = Properties.Resources.UnableToConnectToServer;
}
else if (NativeMethods.ERROR_SUCCESS == iCommunicationServer)
{
ConnectingServerText = properties.Resources.SuccessfullyConnectedServer;
}
ConnectButtonEnable = true;
return;
}
}
您可以使用TPL實現此目的。
private Task previous = Task.FromResult(true);
public Task Foo()
{
previous = previous.ContinueWith(t =>
{
DoStuff();
});
return previous;
}
通過將每個操作安排為上一個操作的延續,可以確保每個操作直到完成之前都不會開始,同時仍在后台線程中運行所有操作。
不必擔心創建和管理線程,只需使用ThreadPool.QueueUserWorkItem
它非常有效。
由於問題的措辭如何,我建議您閱讀MVVM和異步模式,下面是一些示例:
但是通常,請使用async
,在GUI應用程序中編碼時不要手動創建新線程。 如果在“運行”期間該任務不可調用,請通過Interlocked.CompareExchange
進行測試和設置,並保存一些狀態。
您將線程用於並行工作,而不是用於“網絡等待”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.