我有一個函數,可以在指定的位置(使用來自winapi的GetPixel)在很短的時間(50毫秒)內檢查顏色。 現在我使用窗體上的計時器每隔50毫秒調用一次該函數,但是我的應用程序像地獄一樣凍結。線程上的CheckPixelColor
我該如何在一個單獨的線程中重複自己以使其無法凍結用戶界面?
我有一個函數,可以在指定的位置(使用來自winapi的GetPixel)在很短的時間(50毫秒)內檢查顏色。 現在我使用窗體上的計時器每隔50毫秒調用一次該函數,但是我的應用程序像地獄一樣凍結。線程上的CheckPixelColor
我該如何在一個單獨的線程中重複自己以使其無法凍結用戶界面?
由於UI是STA線程,您不能從創建它的線程訪問它。或者你可以通過使用「Control.Invoke
」,但在這種情況下,它運行在消息循環上,所以我認爲你也會遇到一些延遲。
我不得不建議在提出線程準備之前解決性能問題。 50毫秒是一個looong時間。此示例代碼對交互性沒有影響,也沒有對CPU的負荷由一個光點,即使它沒有被優化:
Random rand = new Random();
private void timer1_Tick(object sender, EventArgs e) {
using (var bmp = new Bitmap(1, 1)) {
using (var gr = Graphics.FromImage(bmp)) {
gr.CopyFromScreen(rand.Next(800), rand.Next(600), 0, 0, new Size(1, 1));
Console.WriteLine(bmp.GetPixel(0, 0).ToString());
}
}
}
使用背景工人,並且使用計時器來調用backgroundworker.runasync();. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx