Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 消息队列与线程锁_C#_Multithreading_Thread Safety_Message Queue - Fatal编程技术网

C# 消息队列与线程锁

C# 消息队列与线程锁,c#,multithreading,thread-safety,message-queue,C#,Multithreading,Thread Safety,Message Queue,我有一个基于.net技术的windows应用程序。在我的应用程序中,我从不同的线程中获得大量消息。一旦我得到一条消息,我需要调用一个应该是线程安全的函数。 我用过 lock (lockThis) { TSFunction(message); } 现在有人建议我改用消息队列。我对这种方法一点也不熟悉,但我想选择更好的方法。 我应该切换到消息队列吗?如果是,那么有人能给我指出一些好的教程吗?根据您当前的设计,每当您处理消息时,其他线程都会被完

我有一个基于.net技术的windows应用程序。在我的应用程序中,我从不同的线程中获得大量消息。一旦我得到一条消息,我需要调用一个应该是线程安全的函数。 我用过

lock (lockThis)
        {
            TSFunction(message);
        }
现在有人建议我改用消息队列。我对这种方法一点也不熟悉,但我想选择更好的方法。
我应该切换到消息队列吗?如果是,那么有人能给我指出一些好的教程吗?

根据您当前的设计,每当您处理消息时,其他线程都会被完全阻止。如果这不是问题,那谁在乎呢

如果这让您感到困扰(例如,您希望提高响应能力),那么是的,消息队列将是一个好主意。您需要假定锁,将消息放入队列,然后释放锁(或者找到一个线程安全的集合来为您执行此操作)。然后你以后再处理这个消息。这样,消息发送线程将被阻塞的时间可以忽略不计

但请注意:消息处理将不同步。因此,例如,如果消息处理速度慢,那么一个线程可能在处理多条消息之前发送多条消息。这是你自己决定是否允许的。这实际上会降低应用程序的线程安全性,同时可以提高性能(减少等待时间)


您甚至可以在线程池中进行消息处理,并行处理多条消息,等等。选项无穷无尽。

锁中调用函数不会使函数线程安全。消息队列也不能保证本质上的线程安全。唯一可以可靠地使线程安全的是方法的内容,而不是调用方法的方式。不管是哪种方式,询问StackOverflow是否应该切换都是因为我们对您的系统了解太多(我们不知道您更广泛的需求是什么!),而且在许多情况下也是一个相当主观的问题。这取决于其他线程中的锁定模式。