我有一台"服务器"接收来自"客户"的电话的程序要求做的事情。我想知道这些调用是如何实际完成的 - 是否正在创建一个新线程?
我问,因为这些调用需要等到服务器满足某些条件,如果我while(conditionIsNotMet) Thread.sleep(x);
- 我注意到主线程执行中的一些问题。问题在于,虽然它确实在等待,但主执行线程似乎要慢得多,并且还会以某种方式中断它会产生不良结果。
这是架构:
我的问题是,调用(紫色箭头)是否会中断主线程(创建服务),主线程(执行大部分工作),还是创建新线程?
另外,任何想法为什么while(conditionIsNotMet) Thread.sleep(x);
都可能导致问题?
为了达到同样的效果,还有更好的方法吗?
更多代码:
public class MyServerCommands : MyInterface
{
public void SomeFunction(some parameters)
{
while (conditionIsNotMet)
{
Thread.Sleep(SomeTime);
}
// some more code - mainly, update a google spreadsheet
}
}
public partial class ProgramA : Form
{
// code for starting WCF server, creating background workers, and firing them
private void BkwMain_DoWork(object sender, DoWorkEventArgs e)
{
if (conditionIsNotMet)
{
// do work, mainly update google sheet
}
conditionIsNotMet = false;
}
}
UPDATE :所以在玩了一下之后,我想我可以得出结论,创建服务器的线程是必须共享它的命令。因为在我的应用程序(程序A)中,它是主要线程,也负责UI,这导致UI延迟到while循环结束。 我现在的解决方案是在另一个线程或(父)表单中创建服务器并尝试隐藏它(因为它也会滞后)。 如果有更好的解决方案,请告诉我。
UPDATE / CLARIFICATION :我的意思是"创建服务器"是以下命令:Host = new ServiceHost(typeof(MyServerCommands), baseAddress);
答案 0 :(得分:1)
这取决于您的服务InstanceContextMode和ConcurrencyMode是什么。
我相信ConcurrencyMode
默认是单线程的,所以如果你正在运行一个服务实例(InstanceContextMode.Single
),那么是的,你的主线程将阻止进一步的调用。
如果您希望能够在不同线程上提供服务,则需要ConcurrencyMode.Multiple
,但这显然会打开其他线程问题。
有关详细信息,请参阅Sessions, Instancing, and Concurrency。
顺便说一句,我不会在while循环中推荐Thread.Sleep()
等待。最好等待某种同步对象,如ManualResetEvent
。