[英]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.