2014-01-15 47 views
0

主應用程序線程輪詢服務器發送/接收TCP套接字:ContinueWith等待,直到主長輪詢線程醒來

public void Run(){ 

var updateThreading = new System.Threading.Thread(() => 
      { 
       while (KeepRunning) 
       { 
        System.Threading.Thread.Sleep(1000); 

        try 
        { 
         // Send and receive via TCP socket 
         var response = SendAndReceive(); 
         Callback(response); 
        } 
        catch (Exception exception) 
        { 

        } 
       } 
      }); 

      updateThreading.Start(); 
} 

一個WPF按鈕提供了一個鼠標按下/在分離方法來管理的鼠標後續行動。在鼠標停止事件時,任務在主線程使用的同一套接字上發出服務器請求,同時在鼠標移動事件時,我繼續執行相同的任務,以確保總是執行「壓力已完成」的服務器請求。

下面是鼠標按下的代碼:

public override void Execute_CommandDown() 
    { 
     DownWorkTask = Task.Factory.StartNew(() => 
     { 
      if (!Monitor.TryEnter(SyncRoot)) 
      { 
       return; 
      } // Don't let multiple threads in here at the same time. 
      try 
      { 
       DoDownWork(); // send/receive via the same TCP socket of the main thread 
      } 
      finally 
      { 
       Monitor.Exit(SyncRoot); 
      } 
     }); 
    } 

下面是鼠標向上的代碼。

public override void Execute_CommandUp() 
    { 
     // Make a continuation here... 
     DownWorkTask.ContinueWith(t => 
     { 
      if (!Monitor.TryEnter(SyncRoot)) 
      { 
       // Don't let multiple threads in here at the same time. 
       return; 
      } 
      try 
      { 
       DoUpWork();// send/receive via the same TCP socket of the main thread 
      } 
      finally 
      { 
       Monitor.Exit(SyncRoot); 
      } 
     }); 
    } 

UI線程從來沒有凍結(在我Callback代碼Dispatcher有效地更新GUI),按下按鈕/釋放是反應和操作都在序列「正確地」進行。 我注意到鼠標X事件上的服務器通信有時會等到主線程從睡眠狀態(1000)中喚醒。

我期待的是一個獨立的執行,在TCP套接字和一個監視器上有一個獨特的鎖定部分,以避免多次點擊(兩者都有效)。

我知道任務對象有一個「我會盡快做到這一點」的語義,但我不明白爲什麼它會在這種情況下等待。

回答

1

SyncRoot什麼是從一個UI控件?如果是這樣,我猜你在與UI元素同步時正在觸發一個隱含的UI塊。相反,爲什麼不只是創建一個單獨的對象來鎖定,而完全獨立於另一個對象。

注意,你可能想讓你的線程成爲後臺線程,以防你的應用程序關閉。

+0

SyncRoot是我的Button ViewModel中爲鎖定目的而創建的對象。我使用它來避免同一個按鈕上的多次點擊發送,事實上UI是被動的。 +1爲後臺線程提示! –