WCF异步调用代替同步运行

时间:2013-09-02 16:20:23

标签: c# wcf asynchronous

我正在练习WCF异步调用,但我无法让它运行异步。

代码很简单

protected void btnGetEvals_Click(object sender, EventArgs e)
{
    EvalServiceClient client = new EvalServiceClient("BasicHttpBinding_IEvalService");
    client.GetEvalsCompleted += client_GetEvalsCompleted;
    client.GetEvalsAsync();
    Label1.Text = "Waiting...";
    //client.Close();
}

void client_GetEvalsCompleted(object sender, GetEvalsCompletedEventArgs e)
{
    GridView1.DataSource = e.Result;
    GridView1.DataBind();             
}

这是服务

public class EvalService : IEvalService
{
    List<Eval> evals = new List<Eval>();

    public void SubmitEval(Eval eval)
    {
        evals.Add(eval);
    }

    public List<Eval> GetEvals()
    {
        Thread.Sleep(5000);
        return evals;
    }
}

当我点击btnGetEvals时,我应该在服务执行时立即看到“Waiting ...”并返回evals。相反,两者都需要5秒钟,同时出现“等待......”的故事。

我发现this,建议在完成的回调中关闭客户端,所以现在我只是评论它(因为我不知道如何在完成的回调中关闭它。在该部门的任何帮助也将不胜感激。嗯,这没有帮助。是的,我的服务引用已经设置为允许ansync操作。

我在这里有点不知所措。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是实现WFC异步调用的步骤概述

  • 声明两个相关方法:一个为 BeginMethodName ,另一个为 的 EndMethodName 即可。
  • [OperationContract(AsyncPattern = true)] 添加到相关的开始方法
  • 不要将 OperationContract 属性提供给相应的结束方法
  • 在服务实现中,实际处理应该放在一个方法中,并且这个方法应该在一个单独的线程上运行,为此你可以使用 ThreadPool.QueueUserWorkItem。
  • 在客户端,调用相关的Begin方法,但在此之后不要关闭代理,因为End方法需要相同的通道才能获得结果。您可以在调用End方法后在客户端的回调中关闭它。

实现WCF asyn调用的所有细节都在这里

<强> http://www.codeproject.com/Articles/121345/Asynchronous-Communication-in-a-WCF-Service