Я иду на предположении, что OnBar
не Actaully принимать 30 секунд для запуска, что он делает, это занимает 30 секунд до Старт после вызова ReqBarData. Если это так, то у вас действительно есть Event-based Asynchronous Pattern, самый простой способ справиться с тем, что вы хотите сделать, - это преобразовать его в Task-based Asynchronous Pattern.
Поскольку вы не предоставили Minimal, Complete, and Verifiable example, мне нужно будет внести некоторые изменения в то, как я думаю, что ваша программа работает. Вам нужно будет обновить свой вопрос надлежащим примером, если вы хотите, чтобы код был ближе к тому, что у вас действительно есть. Я сделал предположение, что ReqBarData
имеет перегрузку, которая принимает параметр object state
, который будет передан в OnBar
, а OnBar
также получает список объектов, которые он ожидал.
public Task<List<Bar>> RequestDataAsync()
{
var tcs = new TaskCompletionSource<List<Bar>>();
//This does not need to be on a separate thread, it finishes fast.
CONNECTION.ReqBarData(tcs);
return tcs.Task;
}
virtual override void OnBar(List<Bar> someBars, object stateInfo)
{
//We get our TaskCompletionSource object back from the state paramter
var tcs = (TaskCompletionSource<List<Bar>>)stateInfo;
//we set the result of the task.
tcs.SetResult(someBars);
}
Чтобы использовать его без блокировки пользовательского интерфейса вы просто вызовите функцию и await
она используется асинхронной/ждет
public async void Button1_Click(object sender, EventArgs args)
{
await LoadData();
}
private async Task LoadData()
{
List<Bar> bars = await myConnectionClass.RequestDataAsync();
SomeBinding.DataSource = bars;
}
Пожалуйста, предоставьте детали о том, как первая строка коды и функция OnBar связаны Не совсем ясно, как две функции связаны друг с другом. Похоже, что это [Асинхронный шаблон на основе событий] (https://msdn.microsoft.com/en-us/library/ms228969 (v = vs.110) .aspx). Если да, взгляните на [эту страницу MSDN] (https://msdn.microsoft.com/en-us/library/hh873178 (v = vs.110) .aspx # Anchor_1) –
Если у вас есть длинный метод в 'OnBar', и вы получаете это в потоке пользовательского интерфейса каким-то образом (через invoke?), тогда вы можете использовать тот же' Task.Run' для асинхронного запуска этого кода. Вы этого не делаете, потому что у вас есть проблемы. Расскажи нам. – Sinatr
Вы никогда не должны называть 'Wait()'; вы пытались использовать 'await' вместо этого? –