主應用程序線程輪詢服務器發送/接收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套接字和一個監視器上有一個獨特的鎖定部分,以避免多次點擊(兩者都有效)。
我知道任務對象有一個「我會盡快做到這一點」的語義,但我不明白爲什麼它會在這種情況下等待。
SyncRoot是我的Button ViewModel中爲鎖定目的而創建的對象。我使用它來避免同一個按鈕上的多次點擊發送,事實上UI是被動的。 +1爲後臺線程提示! –