来自客户的来电 - 相同或不同的线程?

时间:2017-06-28 08:31:00

标签: c# wcf server

我有一台"服务器"接收来自"客户"的电话的程序要求做的事情。我想知道这些调用是如何实际完成的 - 是否正在创建一个新线程?

我问,因为这些调用需要等到服务器满足某些条件,如果我while(conditionIsNotMet) Thread.sleep(x); - 我注意到主线程执行中的一些问题。问题在于,虽然它确实在等待,但主执行线程似乎要慢得多,并且还会以某种方式中断它会产生不良结果。

这是架构:

enter image description here

我的问题是,调用(紫色箭头)是否会中断主线程(创建服务),主线程(执行大部分工作),还是创建新线程?

另外,任何想法为什么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);

1 个答案:

答案 0 :(得分:1)

这取决于您的服务InstanceContextModeConcurrencyMode是什么。

我相信ConcurrencyMode默认是单线程的,所以如果你正在运行一个服务实例(InstanceContextMode.Single),那么是的,你的主线程将阻止进一步的调用。

如果您希望能够在不同线程上提供服务,则需要ConcurrencyMode.Multiple,但这显然会打开其他线程问题。

有关详细信息,请参阅Sessions, Instancing, and Concurrency

顺便说一句,我不会在while循环中推荐Thread.Sleep()等待。最好等待某种同步对象,如ManualResetEvent