3

我正在练习 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 时,我应该在服务执行并返回 eval 时立即看到“Waiting...”。相反,两者都需要 5 秒,同时出现带有“Waiting...”的 eval。

我发现了这个,它建议在完成的回调中关闭客户端,所以现在我只是将它注释掉(因为我不知道如何在完成的回调中关闭它。该部门的任何帮助也将不胜感激)。好吧,那没有帮助。是的,我的服务引用已经设置为允许异步操作。

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

4

1 回答 1

1

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

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

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

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

于 2013-09-02T22:11:55.297 回答