我是C#的新手,正在开发一个基于事件的系统来处理来自线程的输入。必须从从线程接收的响应更新UI。我在其中一篇文章中找到并在表单上使用了BeginInvoke。但是,我的问题是,
class CustomDispatcher
{
public void Routine1()
{}
public BeginInvoke()
{
// like in control.BeginInvoke((MethodInvoker)delegate{ Routine1(); });
// This should execute Routine1 asynchronously. This BeginInvoke will be called from a different thread.
}
}
使用表单实例时,BeginInvoke运行良好。但是,如果我可以将表单的调度功能模仿到我的类实例,我无法弄明白。
非常感谢任何帮助。
提前致谢。
答案 0 :(得分:4)
一般情况下,如果您正在制作新的API,并希望编写异步方法,我强烈建议您围绕Task
和Task<T>
类设计API。
这样就可以直接使用C#5中的async
/ await
支持。
在您的情况下,由于Routine1
是一个void方法,您可以编写一个异步处理它的方法,即:
public Task Routine1Async()
{
// Perform the work asynchronously...
}
或者,使用C#5:
public async Task Routine1Async()
{
// Perform the work taking advantage of the await keyword...
await SomeOtherMethodAsync(); // etc
}
话虽如此,如果这只是打算调用Task.Run
或Task.Factory.StartNew
,我会将其从您的API中删除,并让调用者根据需要将其转换为异步方法。我不建议创建一个仅包装同步API的异步API。