Асинхронный вызовы. Блокировка задач. AutoResetEvent

195
25 февраля 2018, 22:57

Добрый день! При вызове метода Set() в AutoResetEvent в обработчике события (EndRequest) происходит полная блокировка всего приложения. Не могу понять почему. Уже голову сломал.:) Где может быть проблема?

Есть класс поставщика данных. У его есть функция делающая запрос к серверу данных и подписка на событие от сервера сигнализирующее об окончании загрузки данных.

// Класс поставщика данных
public class DataProvider
{
    // Поставщик данных
    private AnyServer _anyServer = new AnyServer(); 
    private AutoResetEvent _signal = new AutoResetEvent(false) ; 
    // Данные полученные с сервера
    private List<object> _returnData = new List<object>();
    void DataProvider()
    {       
        //Подписка на событие о завершении загрузки данных 
        _anyServer.EndRequestEvent += EndRequest; 
    }

    // ПРОБЛЕМА ЗДЕСЬ!?
    private EndRequest(int _numberRequest)
    {
        // Что то делаем ... Заполняем _returnData      
        // Сообщаем ожидающей задаче (ServerAddRequestAsync) что событие обработано,данные получены  и можено их возвращать.
        // !!!!! Вот здесь все и  останавливается ;(
        _signal.Set();      
    }
    // Функция запроса данных с сервера
    public async Task<List<object>> ServerAddRequestAsync(int param)
    {
        await Task.Run(() =>
            {           
                // Отрпавляем запрос на сервер
                _anyServer.GetData(param);
                //Ждем завершения события EndRequestEvent (EndRequest);
                // В реале доходим до этого этого момента. Дальше начинает отпрабатывать событие EndRequest. Как только выполняем _signal.Set(); все умирает.:(
                _signal.WaitOne();          
            }
            return _returnData;
    }
}

Далее есть ViewModel в котором есть команда привязання к кнопке во View (используется MVVM Light)

//ViewModel
public MainViewModel : ViewModelBase
{
    private DataProvider provider = DataProvider();
    // Команда "повешенная" на кнопку во View
    public RelayCommand<int> RunRequestCommand => new RelayCommand<int>(async p =>
        {
           await _runRequest(p, cts.Token);
        });
    private async  Task _runRequest(int param, CancellationToken cancellationToken)
    {
        //Можно так
        await Task.Run(()=>
        {
            for (......)
            {
                var resultCollection = provider.ServerAddRequestAsync(param).Result;
            }
        }
        // Или так:
        var resultCollection = await provider.ServerAddRequestAsync(param);
    }
}

После нажатия на кнопку программа виснет. Причем глухо.

Код работает. Проблема была в другом.

READ ALSO
C# работа с dbf файлами

C# работа с dbf файлами

На последней команде вот такая ошибка:

312
Ошибка The build must be stopped before the solution can be closed

Ошибка The build must be stopped before the solution can be closed

Создал пустой проект XamarinForms в VS 2017, запускаю через F5 или кнопкой:

228
Общая доменная логика: .Net Standard или .Net Framework?

Общая доменная логика: .Net Standard или .Net Framework?

Пробую создать демо-решение "Записная книжка" (база контактов), в котором было бы несколько приложений под разные платформы

214
Переменная содержащая тип

Переменная содержащая тип

Доброго времени сутокДля своего проекта понадобилось в переменную засунуть тип данных

221