Приложение C # winform с многопоточным клиентом WCF - PullRequest
0 голосов
/ 02 марта 2011

Я создаю приложение, которое использует клиент WCF для извлечения данных с моего сервера.

Я хочу, чтобы мой вызов службы был асинхронным, поскольку многим из них необходимо изменить пользовательский интерфейс, и я неЯ не хочу терять отзывчивость из моего приложения.

Я пытался использовать *Completed и *Async:

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

Внутри * Завершенного делегата я всегда получаю сообщение об ошибке (Соединение закрыто удаленнохост: я включил все журналы, которые смог найти, но до сих пор не понимаю, почему я получаю эти ошибки)

Синхронные вызовы всегда работают.

У меня есть класс, который обрабатывает все вызовы кservice.

Есть ли способ иметь синхронные вызовы внутри чего-то вроде многопоточного класса?

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

Я закончил тем, что создал свои собственные асинхронные методы, используя BackgroundWorker (вероятно, не best , но он работает):

// 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();
}
0 голосов
/ 02 марта 2011

Вы устанавливаете привязки на стороне клиента, чтобы соответствовать тому, что принимает сервер?

Вам также следует попробовать протестировать его с помощью тестового клиента WCF (обычно в папке% Program Files% \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfTestClient.exe). Если тестовый клиент работает, проверьте привязки.

Ваш звонок даже попадает на сервер? У меня были похожие ошибки при сериализации ответа от сервера к клиенту, так что вы можете проверить это. Если вы попадаете на свой сервер, тогда не проблема связывания, а проблема с сериализацией. Есть ли у вас «наборы» свойств модели данных, которые пытаются десериализовать на сервере?

Я знаю, что это не ответ, но я не был здесь достаточно, чтобы иметь возможность комментировать ... и я был там, где ты, полностью разочарован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...