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

时间:2014-02-10 13:39:42

标签: c# task-parallel-library

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

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

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

3 个答案:

答案 0 :(得分:10)

使用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 :(得分:7)

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

public void BusyWait(int milliseconds)
{
    var sw = Stopwatch.StartNew();

    while (sw.ElapsedMilliseconds < milliseconds)
        Thread.SpinWait(1000);
}

答案 2 :(得分:0)

你几乎做到了:

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来标记调用者方法。)