【问题标题】:What is best way to fake a long running process in parallel processing?在并行处理中伪造长时间运行的进程的最佳方法是什么?
【发布时间】:2014-02-11 00:22:34
【问题描述】:

我想知道当多个任务并行运行时,伪造一个长时间运行的任务的最佳方法是什么。首先想到的是 Thread.Sleep

public void FakeLongRunningTask()
{
Thread.Sleep(5000);
}

但是上面代码的问题是调用 Thread.Sleep 会阻塞这个线程,这意味着它会放弃它的处理器时间片,所以在并行环境中调用一个带有 Thread.Sleep 的方法和根本不调用它一样好.因此,如果我正在并行运行三个任务并且其中一个正在调用 Thread.Sleep,那么这个任务将不会影响性能(尽管它可能会迫使 CLR 生成更多线程!!!)。但我想要的是伪造一个会影响整体性能的任务。

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

    使用4.5框架,我觉得可以使用Task.Delay

    编辑:响应请求。这是一个未经测试的样本:

    async Task LongRunningOperation()
    {
        await Task.Delay(5000);
    }
    
    private async void SomeEvent(object sender, EventArgs e)
    {
        await LongRunningOperation();
    }
    

    第二次编辑:使用 4.0 框架,这可能有效(未经测试):

    Task Delay(int interval)
    {
         var z = new TaskCompletionSource<object>();
         new Timer(_ => z.SetResult(null)).Change(interval, -1);
         return z.Task;
    }
    

    【讨论】:

    • +1 Delay 是完美的,因为 OP 不想真正阻塞线程。如果您提供一个简短但完整的示例,这个答案会更完整。
    • 不确定。 Task.Delay 也不使用 CPU,是吗?
    • 我在 .NET 4 中需要一些东西
    【解决方案2】:

    如果您想要一个忙碌的等待来保持处理器的一个核心被占用,您可以尝试这样的事情:

    public void BusyWait(int milliseconds)
    {
        var sw = Stopwatch.StartNew();
    
        while (sw.ElapsedMilliseconds < milliseconds)
            Thread.SpinWait(1000);
    }
    

    【讨论】:

      【解决方案3】:

      你几乎做到了:

      public async Task FakeLongRunningTask()
      {
          await Task.StartNew(() => Thread.Sleep(5000));
      }
      

      以及在某些情况下的用法(抱歉,Big Daddy =D):

      private async void SomeEvent(object sender, EventArgs e)
      {
          await FakeLongRunningTask();
      }
      

      注意,你必须将它与await 一起使用(这需要调用者方法标记为async)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多