我正在编写一个网络库,用户可以将函数指针传递给某些网络事件执行。为了防止监听循环占用开发人员的应用程序,我将事件处理程序传递给一个线程。不幸的是,这给以线程安全的方式处理事物带来了一些麻烦。例如,如果开发人员传递一个调用其Windows :: Forms应用程序元素的函数,则会抛出InvalidOperationException。
是否有任何处理线程安全的好策略?
答案 0 :(得分:2)
函数指针不能是线程安全的,因为它们声明了一个调用点。所以他们只是指针。 您的代码始终在调用它的线程中运行(通过函数指针)。
您想要实现的是您的代码在特定线程(可能是UI线程)中运行。 为此,您必须使用某种队列将调用同步到MainThread。
这正是Form上的.Net的BeginInvoke()/ Invoke()。在这种情况下(在.NET框架内部的某个地方)队列是Windows消息队列。
但只要“正确”的线程读取并执行来自该队列的调用请求,就可以使用任何其他队列。