如何创建调度程序或将对象与调度程序关联到BeginInvoke调用

时间:2013-08-05 21:39:48

标签: c# .net events dispatcher begininvoke

我是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运行良好。但是,如果我可以将表单的调度功能模仿到我的类实例,我无法弄明白。

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:4)

一般情况下,如果您正在制作新的API,并希望编写异步方法,我强烈建议您围绕TaskTask<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.RunTask.Factory.StartNew,我会将其从您的API中删除,并让调用者根据需要将其转换为异步方法。我不建议创建一个仅包装同步API的异步API。