C# WCF控制台应用程序的性能问题

C# WCF控制台应用程序的性能问题,c#,.net,wcf,console-application,C#,.net,Wcf,Console Application,有一个承载在.Net控制台应用程序中的WCF服务。客户端创建一个到具有回调的服务的双工通道。它通过以下方式调用服务: var task = Task<object>.Factory.FromAsync(clientRay.Proxy.BeginCalc, clientRay.Proxy.EndCalc, lst_RaySrvcDetails, state); 并且MyService.cs通过以下方法接收调用: public IAsyncResult BeginCalc(List&l

有一个承载在.Net控制台应用程序中的WCF服务。客户端创建一个到具有回调的服务的双工通道。它通过以下方式调用服务:

var task = Task<object>.Factory.FromAsync(clientRay.Proxy.BeginCalc, clientRay.Proxy.EndCalc, lst_RaySrvcDetails, state);
并且MyService.cs通过以下方法接收调用:

public IAsyncResult BeginCalc(List<MBSWaldram.DataAccessLayer.Framework.ServiceDetails> input,
                    AsyncCallback callback, object state)
{
   calcInput = input;

   // Create a task to do the work
   var task = Task<object>.Factory.StartNew(this.CalcTasks, state);

   return task.ContinueWith(res => callback(task));
}
public IAsyncResult BeginCalc(列表输入,
异步回调(对象状态)
{
输入=输入;
//创建一个任务来完成工作
var task=task.Factory.StartNew(this.CalcTasks,state);
返回task.ContinueWith(res=>callback(task));
}
现在,运行实际任务的CalcTasks方法显示的性能比在WCF Windows窗体应用程序上的要低。我能想到的一个原因是我使用while(true){;}无限循环的方式,这样应用程序就不会终止并等待来自客户端的调用。我不确定这是最好的。由于某些原因,我无法使用Windows窗体应用程序

如果有人能解释一下为什么会出现性能问题,我将不胜感激。
谢谢。

,而(true){;}
确实是一个不吉利的结构。在控制台应用程序中,改为使用
Console.ReadLine()
。应用程序将等待Enter press。

您的无限while循环将导致大量处理器使用。您应该使用许多可用的同步选项之一,以便您的主方法等待它应该退出的通知。@EdT:谢谢您的回复。你能说出一些不会影响性能的同步方法吗?EventWaitHandle是其中之一吗?是的,其派生的
ManualResetEvent
AutoResetEvent
都在选项中。您还可以启动一个
任务
来托管服务,并在
Main
中调用该任务的
Wait()
。请注意,这些选项依赖于服务知道何时应该停止侦听。我猜你可能想要更类似于Windows服务的东西,你可以通过服务管理器启动和停止。对不起,我想我没有理解你的意思。如果启动一个任务来托管服务,那么一旦托管该服务并退出Main()方法,它就会停止等待。请您提供一个示例代码好吗?这就是为什么我说:“请注意,这些选项依赖于服务知道什么时候应该停止侦听”,因为它们依赖于某种东西(通过
EventWaitHandle
,或通过
任务
完成)提醒应用程序应该退出。看起来你在设计中没有考虑到这一点。您打算如何停止该应用程序?您是否计划提醒服务即将关闭,以便进行任何必要的清理?Windows服务应用程序可以解决这些类型的问题,或者您必须自己动手并提出自己的解决方案。谢谢。Console.ReadLine改进了性能。但如果按下任何键,应用程序将终止。这更多地是关于控制台应用程序,而不是关于WCF。您可以检查用户输入,如“do{Console.Write”(“关闭应用程序类型'exit'));line=Console.ReadLine();}而(line!=“exit”);
public IAsyncResult BeginCalc(List<MBSWaldram.DataAccessLayer.Framework.ServiceDetails> input,
                    AsyncCallback callback, object state)
{
   calcInput = input;

   // Create a task to do the work
   var task = Task<object>.Factory.StartNew(this.CalcTasks, state);

   return task.ContinueWith(res => callback(task));
}