int t1, t2, t3;
// CheckForIllegalCrossThreadCalls = false;
for (int a = 0; a < 1001; a++)
{
for (int b = 0; b < 1001; b++)
{
for (int c = 0; c < 1001; c++)
{
if (a * a + b * b == c * c && a + b + c == 1000)
{
t1 = a; t2 = b; t3 = c;
Action at = new Action(() => { lblNum.Text += $"a is {t1},b is {t2},c is {t3}.\r\n"; });
//Action at1 = new Action(() => { lblNum.Text += $"a is {a},b is {b},c is {c}.\r\n"; });
//lblNum.Text += $"a is {a},b is {b},c is {c}.\r\n";
this.Invoke(at);
}
}
}
}
1,如果CheckForIllegalCrossThreadCalls = false; 直接對控制元件賦值, 耗時2800毫秒.
2,把a,b,c 二次賦值給t1, t2,t3, 耗時2800毫秒
3,利用委托把a,b,c 直接賦值給控制元件,耗時5600毫秒
直接賦值性能損失一倍, 這是什么原因?
uj5u.com熱心網友回復:
Invoke 是通過 Windows API 的 SendMessage 函式實作的,自然要慢一點,但執行緒安全。你直接賦值,程式不穩定,隨時都有可能出問題,如果涉及到 COM 組件的呼叫,只要涉及到操作 UI 部分就會當場崩潰。uj5u.com熱心網友回復:
不管是Invoke還是BeginInvoke, 委托如果直接賦值給控制元件, 速度就慢一倍以上.
如果賦值給臨時變數, 臨時變數再賦值給控制元件, 速度就正常
uj5u.com熱心網友回復:
一個是直接賦值未做執行緒同步,一個是放到同步訊息佇列輪到了再賦值,速度肯定是不一樣的。至于直接賦值變慢,實際上是將運算程序塞到主執行緒里去了,子執行緒只是發起任務沒做任何事,反之你算好結果再呼叫,那主執行緒只是改下值,并不參與額外的計算,那反應速度肯定是不一樣的。
具體可以查看一下Control類里的私有方法InvokeMarshaledCallbacks的實作代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/195534.html
標籤:C#
