首先,我使用统一。这使我坚持使用.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