C# 在单独的线程上启动类操作

C# 在单独的线程上启动类操作,c#,multithreading,C#,Multithreading,我有一个主类,它执行一些操作,另一个类使用套接字与服务器通信 以以下方式创建套接字类的对象是否会使套接字类中的所有操作在单独的线程上运行 await Task.Run(()=>socketObj.initializeSocket()); 或者有其他方法在单独的线程上启动类吗?任务并行库(TPL)在调度异步方法执行时使用大量运行时启发式方法来做出决策不能保证它总是在一个单独的线程上启动(实际上是CLR线程池中的一个线程)。一旦您使用了wait关键字,那么它本质上意味着您的主线程被阻塞,除了

我有一个主类,它执行一些操作,另一个类使用套接字与服务器通信

以以下方式创建套接字类的对象是否会使套接字类中的所有操作在单独的线程上运行

await Task.Run(()=>socketObj.initializeSocket());
或者有其他方法在单独的线程上启动类吗?

任务并行库(TPL)在调度异步方法执行时使用大量运行时启发式方法来做出决策不能保证它总是在一个单独的线程上启动(实际上是CLR线程池中的一个线程)。一旦您使用了wait关键字,那么它本质上意味着您的主线程被阻塞,除了等待
initializeSocket
函数在继续之前完成之外,它无法执行任何有用的工作。特别是在套接字初始化所需时间很短的情况下,TPL可能希望使用主应用程序线程,而不是在其内部任务调度器上对其进行调度。几个月前我也有类似的疑问,这条线索可能会有所帮助:

await Task.Run(()=>socketObj.initializeSocket());

详情如下:

不要担心这些线程中讨论的是其他TPL API,而不是
Task。在您的情况下运行
。不管创建它的API是什么,任务毕竟是一个任务。一旦您进入TPL的世界,大多数任务调度器启发式将保持不变。

任务并行库(TPL)在调度异步方法执行时使用大量运行时启发式来做出决策不能保证它总是在一个单独的线程上启动(实际上是CLR线程池中的一个线程)。一旦您使用了wait关键字,那么它本质上意味着您的主线程被阻塞,除了等待
initializeSocket
函数在继续之前完成之外,它无法执行任何有用的工作。特别是在套接字初始化所需时间很短的情况下,TPL可能希望使用主应用程序线程,而不是在其内部任务调度器上对其进行调度。几个月前我也有类似的疑问,这条线索可能会有所帮助:

详情如下:

不要担心这些线程中讨论的是其他TPL API,而不是
Task。在您的情况下运行
。不管创建它的API是什么,任务毕竟是一个任务。一旦您进入第三方物流的世界,大多数任务调度器启发式将保持不变

以以下方式创建套接字类的对象是否会使套接字类中的所有操作在单独的线程上运行

await Task.Run(()=>socketObj.initializeSocket());
没有

或者是否有其他方法在单独的线程上启动该类

await Task.Run(()=>socketObj.initializeSocket());
我不知道“开课”是什么意思

您当前拥有的代码将在线程池线程上调用
initializeSocket
。它不会导致
socketObj
上的所有其他方法在线程池线程上运行

以以下方式创建套接字类的对象是否会使套接字类中的所有操作在单独的线程上运行

await Task.Run(()=>socketObj.initializeSocket());
没有

或者是否有其他方法在单独的线程上启动该类

await Task.Run(()=>socketObj.initializeSocket());
我不知道“开课”是什么意思


您当前拥有的代码将在线程池线程上调用
initializeSocket
。它不会导致
socketObj
上的所有其他方法在线程池线程上运行。

您所说的“socket类中的所有操作”是什么意思?它使
initializeSocket
和在该方法中调用的任何内容在单独的线程上运行。@MattBurland套接字类有Connect()、send()和receive()等方法。当我调用这些方法时,它们会由单独的线程处理吗?
initializeSocket
做什么?大概它实例化了套接字类。如果然后在该对象上调用方法,则不会,这些方法将在调用它的线程上调用。它们不会神奇地在创建对象的线程上被调用。你说的“套接字类中的所有操作”是什么意思?它使
initializeSocket
和在该方法中调用的任何内容在单独的线程上运行。@MattBurland套接字类有Connect()、send()和receive()等方法。当我调用这些方法时,它们会由单独的线程处理吗?
initializeSocket
做什么?大概它实例化了套接字类。如果然后在该对象上调用方法,则不会,这些方法将在调用它的线程上调用。它们不会神奇地在创建对象的线程上被调用。