В моем приложении у меня есть метод async Save () типа Task<bool>
, который через bool сигнализирует об успешном сохранении. В Save () могут происходить всевозможные вещи, он вызывает другой уровень, где обрабатываются исключения, отображаются возможные диалоги и т. Д., Но это не имеет значения, все, что меня волнует, - это результат bool.
Теперь мне нужно вызвать этот метод из неасинхронного метода (который является переопределением используемого фреймворка, поэтому я не могу просто сделать его асинхронным)
Код выглядит примерно так:
public override void SynchronousMethodFromFramework()
{
bool result = false;
Task.Run(async () => result = await Save());
return result;
}
Проблема в том, что результат возвращается ДО завершения сохранения (поэтому всегда ложно). Как это решить? Я пробовал Task.WaitAll (), .Result, .ConfigureAwaiter (false), но все, что я делаю, кажется, полностью замораживает мое приложение.
Еще немного информации:
Используемая среда WPF - Caliburn.Micro. Моя MainviewModel - это Conductor<IScreen>.Collection.OneActive
, которая выполняет несколько моделей просмотра в элементе управления Tab. Каждая ViewModel представляет собой своего рода экран редактирования. Когда конечный пользователь закрывает приложение (через правый верхний красный крестик), я хочу перебрать все вкладки, чтобы увидеть, есть ли в них ожидающие изменения. Код модели mainview:
public override void CanClose(Action<bool> callback)
{
//for each tab, go to it and try to close it.
//If pending changes and close is not succeeded (eg, user cancels), abort aplication close
bool canclose = false;
Action<bool> result = b => canclose = b;
for (int i = Items.Count - 1; i >= 0; i--)
{
var screen = Items[i];
screen.CanClose(result);
if (!canclose)
{
callback(false);
return;
}
}
callback(true);
}
Код в моем "Edit" -ViewModels:
private async Task<bool> SavePendingChanges()
{
if (!Entity.HasDirtyContents())
return true;
bool? dialogResult = DialogProvider.ShowMessageBox("Save changes",
"There are pending changes, do you want to save them ?", MsgBoxButton.YesNoCancel);
if (dialogResult == null)
return false;//user cancelled
if (dialogResult == false)
return true;//user doesn't want to save, but continue
//try to save; if save failed => return false
return await (Save());
}
public override void CanClose(Action<bool> callback)
{
var task = SavePendingChanges();
task.Wait();
bool result = task.Result;
callback(result);
}
CanClose - это неасинхронный каркасный метод, предоставляемый CM ...
.Wait()
для нее. - person mortb   schedule 25.09.2015Dictionary<Tab, Status>.Any(pair => pair.Value)
. - person tomab   schedule 25.09.2015