C# 只有从特定线程调用某个线程时,才有方法使其发生吗?

C# 只有从特定线程调用某个线程时,才有方法使其发生吗?,c#,C#,好吧,这是个很奇怪的问题,但情况是这样的。我有一个一直在开发的通信库,它的许多特性之一是一个后台线程,它接受来自套接字的所有传入数据包,并根据需要分发它们。在最简单的形式中,您可以有请求或对请求的响应。多个线程可以使用此库在同一套接字上发送请求,然后在其响应到达时等待来自后台线程的信号(事件) 您可以定义一个与后台线程关联的委托来处理传入的请求。简而言之,您可以尝试从该委托发送请求。由于这与后台接收线程位于同一个线程上,因此它将处于死锁状态(线程将阻塞,等待其响应,这永远不会发生)。这些是我和大

好吧,这是个很奇怪的问题,但情况是这样的。我有一个一直在开发的通信库,它的许多特性之一是一个后台线程,它接受来自套接字的所有传入数据包,并根据需要分发它们。在最简单的形式中,您可以有请求或对请求的响应。多个线程可以使用此库在同一套接字上发送请求,然后在其响应到达时等待来自后台线程的信号(事件)


您可以定义一个与后台线程关联的委托来处理传入的请求。简而言之,您可以尝试从该委托发送请求。由于这与后台接收线程位于同一个线程上,因此它将处于死锁状态(线程将阻塞,等待其响应,这永远不会发生)。这些是我和大多数人都知道要避免的情况,但我希望有一种方法抛出异常,或者进行编译时检查,防止程序员尝试调用某个方法,即发送请求的方法,从处理接收的线程。

您可以使用来识别当前正在执行的线程,并通过与目标线程的ID进行比较来做出决策。

您可以使用来识别当前正在执行的线程,并通过与目标线程的ID进行比较来做出决策。

您可以命名您的线程

Thread.CurrentThread.Name = "Any name you like";
也可以创建一个静态字段来保存线程Id

SomeClass.RequestSenderThreadId = Thread.CurrentThread.ManagedThreadId;
然后在你的方法中

if(SomeClass.RequestSenderThreadId == Thread.CurrentThread.ManagedThreadId)
{
    throw new OperationException("You cant use this method in this thread");
}

你可以命名你的线程

Thread.CurrentThread.Name = "Any name you like";
也可以创建一个静态字段来保存线程Id

SomeClass.RequestSenderThreadId = Thread.CurrentThread.ManagedThreadId;
然后在你的方法中

if(SomeClass.RequestSenderThreadId == Thread.CurrentThread.ManagedThreadId)
{
    throw new OperationException("You cant use this method in this thread");
}

似乎每个响应处理程序都会阻止对后台线程的所有请求?为什么不在单独的线程中处理响应呢?只是好奇…@6opuc,因为它是一个库,我想在同一个线程上完成这一切。像服务器这样只响应请求但从不自己发出任何请求的情况不需要第二个线程,因为这只会浪费资源。这个想法应该是程序员应该有一个单独的线程来处理所有请求,但是如果我或其他使用库的人不小心试图将自己的请求作为响应的一部分发送,我宁愿使用异常而不是死锁。但是这种情况不应该出现,如果库被正确使用,每个响应处理程序似乎都会阻止对后台线程的所有请求?为什么不在单独的线程中处理响应呢?只是好奇…@6opuc,因为它是一个库,我想在同一个线程上完成这一切。像服务器这样只响应请求但从不自己发出任何请求的情况不需要第二个线程,因为这只会浪费资源。这个想法应该是程序员应该有一个单独的线程来处理所有请求,但是如果我或其他使用库的人不小心试图将自己的请求作为响应的一部分发送,我宁愿使用异常而不是死锁。但是,如果正确使用了库,就不应该出现这种情况