簡體   English   中英

在沒有ThreadPool的wpf(c#)應用程序中一次又一次地重復使用同一單線程執行同一任務

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

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