我有一个基于Action
的{{1}}看起来像这样:
UndoRedoTransactionManager
在我的代码库中使用,如下所示:
public interface IUndoRedoTransactionManager
{
bool CanDo { get; }
bool CanUndo { get; }
void ClearHistory();
bool Do(Action doAction, Action undoAction, string description);
bool Redo();
void RedoAll();
bool Undo();
void UndoAll();
}
我正在制作一些新代码,我想在其中使用我的var done = false;
_manager.Do(() =>
{
Thread.Sleep(100);
SomeUiWork();
done = true;
}, () =>
{
Thread.Sleep(100);
UndoSomeUiWork();
done = false;
}, "Description");
:
UndoRedoTransactionManager
根据我的理解,这个新代码创建了var done = false;
_manager.Do(async () =>
{
await Task.Delay(100);
SomeUiWork();
done = true;
}, async () =>
{
await Task.Delay(100);
UndoSomeUiWork();
done = false;
}, "Description");
,应该尽可能避免。它也不能保证它在没有阻塞的情况下运行。
我已经阅读了很多博客,但我无法理解它们将信息转换为我的情况(我是异步编程的新手,可能做了很多错误)
我的问题是:如何扩展基于async void
的{{1}}以支持Action
?或如何才能最好地解决我的问题问题?
我注意到我可以在界面中添加一个新方法:
UndoRedoTransactionManager
编译器会在使用async/await
时自动选择这个(并告诉我等待它),但是我会遇到互换性问题。
我的完整Task<bool> Do(Func<Task> action, Func<Task> undoAction, string description);
实施:
async lambda