C# WCF控制台应用程序的性能问题
有一个承载在.Net控制台应用程序中的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
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));
}