КАК СДЕЛАТЬ асинхронный вызов в WCF синхронным - PullRequest
1 голос
/ 02 марта 2011
public class AllViewModel 
{

    private List<Settings> SettingsList;

    public ViewAgendaAllViewModel()
    {
        client.SupplierListWithSettings(GetSupplierListWithSettings_Completed)
    }

    public void GetSupplierListWithSettings_Completed(object sender, Supplier_GetListWithSettingsCompletedEventArgs e)
    {

        if (e.Error == null)
        {
            if (e.Result != null)
            {
               SettingsList = new List<Settings>(); 
                foreach (VCareSupplierDto obj in e.Result)
                {
                    SettingsList.Add(obj);

                }
            }

        }
    }
}

Проблема: не удалось установить список настроек из-за асинхронного вызова.

это мой класс, я хочу синхронизировать вызов ServiceMethod SupplierListWithSettings.

Когда я создам экземпляр AllViewModel, он должен быть загружен с настройкой.

Ожидается: когда я создам экземпляр AllViewModel, он должен содержать свойство SettingList.

1 Ответ

1 голос
/ 02 марта 2011

Исправление: SettingsList устанавливается , но звучит так, как будто он не установлен так быстро, как вам хотелось бы.

Похоже, что вы просите об этом: когда вы создаете экземпляр AllViewModel, вы ожидаете, что свойство SettingsList будет полностью заполнено до того, как конструктор AllViewModel вернется.

Хотя это можно сделать, есть много причин, по которым это, вероятно, не очень хорошая идея и сомнительное требование к дизайну. Выполнение сетевого вызова в виде синхронного вызова блокирует вызывающий поток (обычно ваш поток пользовательского интерфейса) на время, необходимое для завершения сетевого запроса, которое может составлять от 20 до 30 секунд. Вы действительно хотите, чтобы пользовательский интерфейс приложения зависал на 30 секунд? Ваши пользователи могут предположить, что ваша программа потерпела крах или «заблокирована», и закроет программу, даже не подозревая, что она не умерла.

Тем не менее, вот как это сделать: вы можете преобразовать асинхронный вызов в синхронный вызов, используя что-то вроде этого (не проверено) с помощью параллельной библиотеки задач .NET 4.0 (TPL):

public AllViewModel()
{
    var task = Task<List<Settings>>.Factory.StartNew(() =>
                     client.SupplierListWithSettings((s,e) => 
                     {
                         if (e.Error == null && e.Result != null)
                         {
                             var list = new List<Settings>(); 
                             foreach (VCareSupplierDto obj in e.Result)
                             {
                                 list.Add(obj);
                             }
                             task.SetResult(list);
                         }
                     }));
    this.SettingsList = task.Result;
}

Опять же, это не очень хорошая идея. Для вас было бы гораздо лучше посмотреть, какие части вашего кода предполагают, что свойство SettingsList заполняется сразу после создания объекта, и изменить эти зависимости, чтобы сделать что-то вроде прослушивания изменений в свойстве SettingsList и выполнять их работу как как только SettingsList фактически заполняется асинхронно.

Попытайтесь идти с асинхронным потоком вместо того, чтобы бороться с ним.

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