我正在构建一个控件,将被其他开发人员使用,在一些地方我有事件,开发人员可以订阅以执行一些潜在的长操作。
我的目标是给他们选择使用异步/等待、多线程、后台工作者等选项,如果他们选择,但仍能在事件调用完成之前完成执行。以下是一个伪代码示例(我意识到这不会编译,但希望意图清晰):
我的代码:
我的目标是给他们选择使用异步/等待、多线程、后台工作者等选项,如果他们选择,但仍能在事件调用完成之前完成执行。以下是一个伪代码示例(我意识到这不会编译,但希望意图清晰):
我的代码:
public event MyEventHandler MyEvent;
private void InvokeMyEvent()
{
var args = new MyEventArgs();
// Keep the UI responsive until this returns
await MyEvent?.Invoke(this, args);
// Then show the result
MessageBox.Show(args.Result);
}
开发者/订阅者的潜在代码:
// Option 1: The operation is very quick,
// so the dev doesn't mind doing it synchronously
private void myForm_MyEvent(object sender, MyEventArgs e)
{
// Short operation, I'll just do it right here.
string result = DoQuickOperation();
e.Result = result;
}
// Option 2, The operation is long,
// so the dev wants to do it on another thread and keep the UI responsive.
private void myForm_MyEvent(object sender, MyEventArgs e)
{
myForm.ShowProgressPanel();
// Long operation, I want to multithread this!
Task.Run(() =>
{
string result = DoVeryLongOperation();
e.Result = result;
})
.ContinueWith((task) =>
{
myForm.HideProgressPanel();
}
}
有没有标准的方法来实现这个?我看了一下委托的BeginInvoke和EndInvoke方法,希望它们能有所帮助,但我并没有想到什么解决方案。
非常感谢任何帮助或建议!
Task
成为Task<T>
,并以此获取结果。 - Servy