2014-02-10 39 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)使用它。

相關問題