WCF异步调用变成同步运行

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时,应该立即看到“等待…”,而服务执行并返回evals。相反,两者都需要5秒钟,并且带有“等待…”的evals同时出现。
我发现this,其中建议在完成回调中关闭客户端,因此目前我只是将其注释掉(因为我不知道如何在完成回调中关闭它。在这方面的任何帮助也将不胜感激)。好吧,那没有帮助。是的,我的服务引用已经设置为允许异步操作。
我有点茫然无措。有什么建议吗?

如果您正在使用.NET 4.5/C# 5.0,您可以使用await/async模式 - 这样使用会更加容易。 - Tim
在调用运行时中断调试器。UI线程上的堆栈上有什么?显示外部代码。 - usr
1个回答

1

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

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

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

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


那是在服务器端的事情。另外,ThreadPool.QueueUserWorkItem不是使WCF服务器异步化的方法。 - usr
@usr,我只是在概括我找到的内容。它说实际方法需要在单独的线程上运行,而QueueUserWorkItem只是其中一种方法。此外,我提到了客户端和服务器端。 - Mauricio Gracia Gutierrez
我会仔细阅读这篇文章,并告诉您其中的成果。感谢提供这个资源! - erstaples

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接