在并行处理中伪造长时间运行的进程的最佳方法是什么



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

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

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

如果你想要一个繁忙的等待,这将使处理器的一个内核被占用,你可以尝试这样的事情:

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

使用 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;
}

你几乎做到了:

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

以及某些事件中的用法(对不起,大爸爸=D):

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

请注意,您必须将其与await一起使用(这需要用 async 标记调用方方法)。

最新更新