从异步任务调用主线程上的委托

本文关键字:线程 异步 任务 调用 | 更新日期: 2023-09-27 18:26:33

这似乎很简单。。。希望在.NET 3.5中执行此操作(如果可能,则与CF兼容)。

我想调用一个函数,并向它传递一个回调函数,该函数在完成时触发。这是怎么做到的?

示例代码:

public static void downloadTemplateDataAsync(int officeID, int? workbookID, TemplateType templateType, int? templateID, TemplateRequestDelegate callback)
{
    Template t = null;
    System.Threading.Thread callingThread = System.Threading.Thread.CurrentThread;
    new System.Threading.Thread(() =>
    {
        t = downloadTemplateData(officeID, workbookID, templateType, templateID);
        // Dispatch callback
        callback.Invoke(t);
    }).Start();
 }

从异步任务调用主线程上的委托

我同意评论中的问题,为什么要在主线程上执行委托?也就是说,如果你坚持可以用几种方法来完成,这两种方法都需要你为你的主线程实现一些基础设施来允许它

最简单的理解是编写一些明确的代码来进行协调。例如,取您的原始代码:

public static void downloadTemplateDataAsync(int officeID, int? workbookID, TemplateType templateType, int? templateID, TemplateRequestDelegate callback)
{
    Template t = null;
    object o = new object();
    System.Threading.Thread callingThread = System.Threading.Thread.CurrentThread;
    new System.Threading.Thread(() =>
    {
        t = downloadTemplateData(officeID, workbookID, templateType, templateID);
        // Signal completion
        lock (o) Monitor.Pulse(o);
    }).Start();
    lock (o) Monitor.Wait(o);
    callback.Invoke(t);
    }
 }

请注意,这将阻塞主线程,而另一个线程则执行其工作。这样做几乎总是错误的,但确实确实完成了你的请求。

如果您希望主线程继续处理其他事情,那么需要实现它来执行其他事情,同时定期检查任务的完成情况,此时它将调用委托。WinForms和WPF程序有一个消息泵送循环,也用于此目的。如果你想在你的非GUI程序中有同样的行为,你就必须重新发明那个特定的轮子。

好的一面是,如果你这样做,同时实现一个与你的实现一起工作的自定义SynchronizationContext,那么你基本上可以免费获得.NET的其他跨线程功能。从不那么好的方面来说,做所有这些都是一项的工作。

你真的确定你需要这种行为吗?如果你更详细地解释你真正想要实现的目标,你可能会得到更好的答案。