我有一个主类,它执行一些操作,另一个类使用套接字与服务器通信。
以下列方式创建套接字类的对象是否会使套接字类中的所有操作都在一个单独的线程上运行?
await Task.Run(()=>socketObj.initializeSocket());
或者是否有另一种方法可以在单独的线程上启动该类?
答案 0 :(得分:0)
任务并行库(TPL)使用大量运行时启发式方法在调度异步方法执行时做出决策。 无法保证它将始终在单独的线程上启动(这实际上是来自CLR线程池的线程)。一旦你使用了await关键字,那么它实际上意味着你的主线程被阻止了,除了等待你的customerCall.CallStatusTypes = db.CallStatus.ToList();
函数完成之后它不能做任何有用的工作,然后再继续。特别是在套接字初始化时间非常短的情况下,TPL可能希望使用您的主应用程序线程,而不是在其内部任务调度程序上进行调度。几个月前我有一些类似的疑问,这个帖子可能有所帮助:
此处有更多详情:
Is Task.Factory.StartNew() guaranteed to use another thread than the calling thread?
在您的情况下,不要担心这些线程中讨论的其他TPL apis而不是initializeSocket
。毕竟任务是一项任务,无论创建它的API如何。一旦进入TPL世界,大多数任务调度程序启发式方法都将保持不变。
答案 1 :(得分:0)
以下列方式创建套接字类的对象是否会使套接字类中的所有操作都在一个单独的线程上运行?
没有
或者是否有另一种方法可以在单独的线程上启动该类?
我不确定“发起课程”是什么意思。
您目前拥有的代码将在线程池线程上调用initializeSocket
。它不会导致socketObj
上的所有其他方法在线程池线程上运行。