首先,我使用統一。這使我堅持使用.NET 3.5。我目前正在使用一個服務器程序,該程序使用Socket
對象的異步方法(例如,BeginReceive
,BeginAccept
,BeginReceiveFrom
等)。當服務器從客戶端接收到數據包時,該數據包將在工作線程上接收。現在我在工作線程上留下了一些數據,並且我希望主線程使用我指定的函數處理這些數據。我實施了:FIFO編程的主線程調度程序?
using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
public class MyDispatcherClass
{
public delegate void MyDel();
private readonly Queue<MyDel> commands = new Queue<MyDel>();
Object lockObj = new object();
public void Add(MyDel dc)
{
lock (lockObj)
{
commands.Enqueue (dc);
}
}
public void Invoke()
{
lock (lockObj)
{
while (commands.Count > 0)
{
commands.Dequeue().Invoke();
}
}
}
}
然後我就用這種方式:
// As a global variable:
MyDispatcherClass SomeDispatcher = new MyDispatcherClass();
//The function that I want to call:
public void MyFunction (byte[] data)
{
// Do some stuff on the main thread
}
//When I receive a message on a worker thread I do that:
SomeDispatcher.Add (()=> MyFunction (byte[] data)); //Asuume that "data" is the message I received from a client
//Each frame on the main thread I call:
SomeDispatcher.Invoke();
經過一番研究,我發現lock
聲明並不能保證100%實現FIFO。這不是我想要的,有時這可能會導致服務器出現故障!我希望以%100保證達到相同的結果,即數據將按照從客戶端收到的相同順序處理。我怎麼能做到這一點?
你是否從一個客戶端獲得了所有的數據?如果是這樣,你可以添加一個'AddRange'方法到你的調度器,該調度器使用'IEnumerable'作爲參數,並將它們添加到同一個鎖體中。 –
ArgusMagnus
我以前檢查過這個。我從每個客戶端接收1到1的數據,並且我調用SomeDispatcher.Add的線程可能會不斷變化,即使對於每個客戶端(這是由Microsoft執行的)。 – None