【问题标题】:Using ThreadPool With Callbacks使用带有回调的线程池
【发布时间】:2014-03-07 03:53:39
【问题描述】:

我正在使用ThreadPool 分别处理我的 Socket 服务器中的每个连接的 Socket。但是我想知道 BeginReceive 的回调是否也会在 ThreadPool 中执行

ThreadPool.QueueUserWorkItem(o =>
{
    if (ClientExchange != null && ClientExchange(asynchronousState)) {
        if (ClientConnect != null) {
            ClientConnect(asynchronousState);
        }
    }
    ConnectedClients.Add(ipEndPoint, socket);
    socket.BeginReceive(asynchronousState.Buffer, 0, asynchronousState.Buffer.Length, SocketFlags.None, HandleAsyncReceive, asynchronousState);
});

HandleAsyncReceive 回调是否也在新线程(被线程池抓取)中执行?

【问题讨论】:

  • 打印Thread.CurrentThread.ManagedThreadId时看到了什么?
  • 您不需要显式使用池线程。您可以在调用BeginReceive-callback 的同一线程上进行处理,这将是一个随机但不同的池线程。检查 cmets 到这个答案:stackoverflow.com/a/22017432/1768303

标签: c# multithreading


【解决方案1】:

异步 ​​IO 的回调在线程池线程上调用。

线程池线程永远不会为任何特定目的而保留。每个工作项都可以看到完全不同的线程 ID。或者所有工作项都可以看到相同的线程 ID。没有任何保证。

通常,您不依赖于您的代码将在哪个线程上运行。这通常是一个错误。你不应该关心这个(我不清楚你为什么这样做)。

我想做的是在不同的线程上处理每个接受的 Socket

这在异步 IO 的上下文中没有意义。异步 IO 是无线程的。当一个 IO 运行时,没有线程在使用它。

【讨论】:

  • 我不想在新线程上做回调,我想做的是在不同的线程上处理每个接受的 Socket(包括所有的回调)
  • 另一种奇怪的方式见我更新的主题(见代码中的 cmets)
  • 是的,这很有用,但是我想在单独的线程上处理每个连接,因为在我的自定义类回 OnClientConnect 和 OnClientExchange 等内部......我正在使用同步代码进行某些操作,当我这样做时没有ThreadPool 我让所有的服务器以及控制台应用程序都挂了 idk 为什么?
  • 我不知道,这似乎超出了这个问题的范围。您可以混合使用同步和异步 IO。那应该行得通。错误是另一回事。打开一个新问题并发布代码。
猜你喜欢
  • 2018-03-24
  • 2018-06-28
  • 2011-10-20
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多