我有一个名为Do()
的方法,它执行一些计算,然后将结果保存在 2 个不同的文件中,然后进行一些其他计算。由于文件可能很大,我想使用任务或类似的东西来更新文件,以防止 UI 冻结。我尝试使用TaskFactory
和Wait
和WaitAll
,但它们冻结了UI。另一种选择是ContinueWith
但是之后有很多代码,我无法将它们向上移动,并且我认为将它们全部移动ContinueWith
是不正确的做法。使用async/await
很容易,但我必须使用.NetFramework4,所以我不能使用它们。我认为它的另一个选择是调用一个方法并创建一个backgroundworker
,在其中更新文件,并在Runworkercompleted event
调用一个方法来执行剩余操作。但它更丑陋。有没有更好的方法可以在方法中间的单独线程/任务中执行某些操作而不影响其他代码和 UI 线程?这就像在单独的线程/任务中执行所有方法工作一样,并且在完全完成而不冻结 UI 之前不要离开它。
注意:我必须使用 .网络框架工作4.
Do
方法是:
public void Do()
{
//---------------
//other codes
//---------------
SaveResult1();
SaveResult2();
//---------------
//other codes that I can not move them up
//---------------
}
你可以这样做:
void Do()
{
// Some code
Task.Factory.StartNew(() =>
{
SaveResult1();
SaveResult2();
})
.ContinueWith(t =>
{
// Other code
});
}
要执行长时间的操作,您可以考虑一些选项。我一直喜欢的这些选项之一是beginInvoke
方法。您需要做的就是进行适当的委派,该委托具有所需方法的相同签名。解雇代表团有两种不同的方法。同步或异步。使用此方法,它允许您的 UI 完成自己的工作,而第二个线程负责执行慢速部分。调用 beginInvoke 方法时,第一个线程会生成第二个线程并继续。它还让您知道工作是否已完成。这里该方法的第一个参数是callback
方法。好消息是,您可以使用第二个参数将当前状态传递给回调方法。
看看下面的代码:
首先定义委托
public delegate void SimpleDelegate();
然后封装你的方法并触发它
var obj = new ClassA();
var del = new SimpleDelegate(obj.Do);
Console.WriteLine("Start");
del.BeginInvoke(null, null);
Console.WriteLine("End");
Console.ReadKey();
这是一个长期的行动。
public void Do()
{
Thread.Sleep(5000);
Console.WriteLine("Done!");
}