【问题标题】:C# winform application with threaded WCF client带有线程 WCF 客户端的 C# winform 应用程序
【发布时间】:2011-03-02 11:10:33
【问题描述】:

我正在构建一个使用 WCF 客户端从我的服务器检索数据的应用程序。

我希望我对服务的调用是异步的,因为他们中的许多人需要更改 UI,而且我不想失去我的应用的响应能力。

我尝试使用*Completed*Async

ServiceUserClient client = new ServiceUserClient();
client.FindUserCompleted += delegate(object sender, FindUserCompletedEventArgs e)
{
    // here e.Result always fails
};
client.FindUserAsync(text);

在 *Completed 委托中我总是收到一个错误(远程主机关闭了连接:我启用了我能找到的所有日志记录,但我仍然不明白为什么会出现这些错误)

同步调用始终有效。

我有一个类来处理对服务的所有调用。

有没有办法在线程类之类的内部进行同步调用?

【问题讨论】:

  • 您是否也在客户端和服务器上使用了 WCF 跟踪? msdn.microsoft.com/en-us/library/ms733025.aspx
  • 是的,我仍然无法弄清楚为什么它给了我这个错误:在尝试建立与 net.tcp:/// 的连接时操作被中断。
  • 我总是在得到 e.Result 之前检查 e.Error。 e.Error 说什么?
  • 它说的是我在之前的评论中写的消息: CommunicationObjectAbortedException: The operation was interrupted while trying to build an connection to net.tcp:///

标签: c# multithreading wcf asynchronous


【解决方案1】:

您是否设置客户端绑定以匹配服务器接受的内容?

您还应该尝试使用 WCF 测试客户端(通常在 %Program Files%\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe 下)对其进行测试。如果测试客户端正常工作,则检查绑定。

你的电话甚至可以到达服务器吗?在序列化从服务器到客户端的响应时,我也发生过类似的错误,因此您可能需要检查一下。如果您到达您的服务器,则绑定不是问题,而是存在序列化问题。您是否在试图在服务器上反序列化的数据模型属性上有“集合”?

我知道这不是答案,但我到这里的时间还不够多,无法获得 cmets...而且我一直在你所在的地方,完全令人沮丧。

【讨论】:

  • 他提到同步调用可以工作,所以序列化不会有问题。
  • 我现在明白了……谢谢。也许尝试使用客户端或 WCFStorm?
【解决方案2】:

我最终以这种方式使用 BackgroundWorker 创建了自己的异步方法(可能不是最好的方式,但它确实有效):

// this is the click event on my search button
private void FindUser_Click(object sender, EventArgs e)
{
    this.UserListSearch.Enabled = false;
    this.UserListSearch.Items.Clear();
    Model.FindUser(FindText.Text.ToUpper(), userlist =>
    {
        foreach (User u in userlist)
        {
            ListViewItem item = new ListViewItem(u.UserName);
            item.Name = u.UserName;
            item.SubItems.Add(u.Description);
            this.UserListSearch.Items.Add(item);
        }
        this.UserListSearch.Enabled = true;
    });
}

// this is the function I call when I need async call
public void FindUser(string text, Action<User[]> callback)
{
    CreateBackgroundWorker<User[]>(() =>
        {
            ServiceUsersClient client = new ServiceUsersClient();
            var results = client.FindUser(text);
            client.Close();
            return results;
        }, callback);
}

// this is my utility function to create a bgworker "on demand"
private void CreateBackgroundWorker<T>(Func<T> dowork, Action<T> callback)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += (sender, args) =>
    {
        T result = dowork.Invoke();
        (callback.Target as Form).Invoke(callback, result);
    };
    worker.RunWorkerAsync();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2013-11-13
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多