我对此需要超过几秒钟来完成更多的多个操作的类。在此期间,我想更新UI。所以BackgroundWorker通常是最好的选择。但由于某种原因,BackGroundWorker并不总是以我想要的方式工作(例如:当我尝试对事件使用WebBrowser并调用ReportProgress事件时,BackgroundWorker看起来崩溃)。
因此,我通过将Ui从主线程分离来避免所有这些。
此伪更好地解释它:
public Ui ui;
main
{
Thread threadUi = new Thread(initiateUi);
//Initiate and start Thread
//Everything I will do from here on will not have any consequences
//on my ui.
//
//Object Ui can still be publicly accessed, making it possible to
//update the user interface.
}
现在,当我有Bar类的一个实例,我将使它的UI这样的访问:
public Bar bar1;
public Bar bar2;
main
{
//
//other stuff here
//
Thread threadBar1 = //New Thread where I call the Bar initializer function
//and pass bar1 as parameter.
Thread threadBar2 = //idem dito, except with bar2 as parameter
//
//other stuff here
//
}
有了这个设计,我可以打电话bar1和bar2从我的用户界面使用以下功能:
Program.bar1.someFunction();
问题:
现在让我们说我有一个名为FooHandler的类。该类有一个函数,用于在某个FooDepository中搜索Foo的所有实例,以及其他函数来操纵Foo对象。这是一个静态类,因为在我的情况下,它不需要有多个实例。
但是,如果我要从FooHandler调用一个函数,该函数将在我的UI线程中运行,因为这是调用线程(我不太确定,但我找不到有关此主题的任何文档)。所以我很有可能面临我开始的问题。
问题:
是否有可能访问静态类的功能,而无需使用来自调用线程的处理能力?
我正在使用.Net 4.0。所以我会研究这个Task对象。 编辑:哇!使用任务就像下面这样简单: 任务t =新任务(new Action(()=> {FooHandler.someFunction();}));? – Jordy
是的,这很容易:)很高兴帮助。请使用通用版本的任务,然后你可以做t.Result(这将阻止线程,所以要小心)返回你的类型。此外,您不需要执行新的操作,下面是一个示例:任务 task = new任务(()=> FooHandler.someFunctionThatReturnsString()); –