繁体   English   中英

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

[英]Call delegate on main thread from asynchronous task

这似乎很简单...想要在.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的其他跨线程功能。 在不那么光明的一面,尽一切是大量的工作。

您真的确定您需要这种行为吗? 如果您更详细地说明您实际要完成的工作,则可能会得到更好的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM