Добрый день! При вызове метода 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);
}
}
После нажатия на кнопку программа виснет. Причем глухо.
Код работает. Проблема была в другом.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей