nav*_*een 3 c# task-parallel-library
我想知道当多个任务并行运行时,伪造长时间运行任务的最佳方法是什么.首先想到的是Thread.Sleep
public void FakeLongRunningTask()
{
Thread.Sleep(5000);
}
Run Code Online (Sandbox Code Playgroud)
但是上面代码的问题是调用Thread.Sleep会阻塞这个线程,这意味着它会放弃它的处理器时间片,所以在并行环境中调用Thread.Sleep的方法就好根本不调用它.因此,如果我并行运行三个任务,其中一个是调用Thread.Sleep,那么此任务对性能没有影响(尽管它可能会强制CLR生成更多线程!!!).但我想要的是伪造一个会影响整体表现的任务.
Big*_*ddy 10
使用4.5框架,我认为你可以使用Task.Delay
编辑:回应请求.这是一个未经测试的样本:
async Task LongRunningOperation()
{
await Task.Delay(5000);
}
private async void SomeEvent(object sender, EventArgs e)
{
await LongRunningOperation();
}
Run Code Online (Sandbox Code Playgroud)
第二次编辑:使用4.0框架,这可能有效(未经测试):
Task Delay(int interval)
{
var z = new TaskCompletionSource<object>();
new Timer(_ => z.SetResult(null)).Change(interval, -1);
return z.Task;
}
Run Code Online (Sandbox Code Playgroud)
如果你想要一个繁忙的等待,这将使处理器的一个核心被占用,你可以尝试这样的事情:
public void BusyWait(int milliseconds)
{
var sw = Stopwatch.StartNew();
while (sw.ElapsedMilliseconds < milliseconds)
Thread.SpinWait(1000);
}
Run Code Online (Sandbox Code Playgroud)