-2

我有一个方法叫它Do()做一些计算,然后将结果保存在 2 个不同的文件中,然后做一些其他的计算。由于文件可能很大,我想通过使用任务或类似的东西来更新文件,以防止 UI 冻结。我尝试使用TaskFactoryandWaitWaitAll他们冻结了 UI。另一种选择是ContinueWith,但后面有很多代码我无法将它们向上移动,而且我认为将它们全部移动不是ContinueWith正确的做法。使用起来很容易,async/await但我必须使用 .NetFramework4 所以我不能使用它们。我考虑的其他选择是调用一个方法并创建一个backgroundworker,在其中更新文件并在Runworkercompleted event调用一个方法来做剩余。但它更丑陋。有没有更好的方法可以在方法中间的单独线程/任务中做某事而不影响其他代码和 UI 线程?这就像在单独的线程/任务中执行所有方法一样,并且在不冻结 UI 的情况下完全完成之前不要离开它。

注意:我必须使用 .NetFrameWork4。

方法Do是:

public void Do()
{
    //---------------
    //other codes
    //---------------

    SaveResult1();
    SaveResult2();

    //---------------
    //other codes that I can not move them up
    //---------------
}
4

2 回答 2

0

你可以这样做:

void Do()
{
    // Some code

    Task.Factory.StartNew(() =>
    {
        SaveResult1();
        SaveResult2();
    })
    .ContinueWith(t =>
    {
        // Other code
    });
}
于 2017-07-02T11:24:32.427 回答
0

要执行长时间的操作,您可以考虑一些选项。我一直喜欢的这些选项之一是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!");
  }
于 2017-07-02T12:04:02.917 回答