2014-02-10 25 views
3

我想知道当多个任务并行运行时,假冒长时间运行的任务的最佳方式是什么。自带的头脑第一件事就是了Thread.Sleep在并行处理中伪造长时间运行的进程的最佳方式是什么?

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

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

回答

5

,你可以尝试这样的事:

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

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

使用4.5框架,我认为你可以使用Task.Delay

编辑:在回答请求。下面是一个未经测试的样本:

async Task LongRunningOperation() 
{ 
    await Task.Delay(5000); 
} 

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

2日编辑:使用4.0框架,这可能工作(未经测试):如果你想要一个忙等待这将让占据了处理器的一个核心

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

+1延迟是完美的,因为OP不想实际阻止线程。如果你提供了一个简短但完整的例子,这个答案会更完整。 – James

+1

不确定。 'Task.Delay'也不使用CPU,是吗? –

+0

@MthetheWWatson是你的权利,它不使用。 – terrybozzio

0

你几乎做到了:

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

和使用在某些情况下(对不起,爸爸大= d):

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

通知,你有什么用await(这需要调用者的方法被打上async)使用它。

相关问题