一、原因分析
跨線程調(diào)用控件會出現(xiàn)這個錯誤的原因是因為:.NET禁止了跨線程調(diào)用控件, 否則誰都可以操作控件,最后可能造成錯誤。 所以不是在創(chuàng)建控件所在的線程內(nèi)調(diào)用就會發(fā)生這樣的錯誤。
二、解決辦法
方法1:設(shè)置CheckForIllegalCrossThreadCalls =false 是能去掉這個檢查的,但是這不是標(biāo)準(zhǔn)的作法.
方法2:定義一個委托(delegate),委托(delegate)可以將參數(shù)與方法傳遞給控件所在的線程,并由控件所在的線程執(zhí)行,通過Invoke來調(diào)用,這樣可以完美的解決此類問題。
Action action = () =>
{
? ? TimeBox.Text = TimeString;
? ? ResultBox.Text = hv_ResultStr;
? ? DisplayImageHalconWindow(AcqImage, GrayImage);
? ? DisplayImageHalconWindow(ThresholdImage, MeanImage);
};
Invoke(action);
三、總結(jié)
在控件的線程中遇到阻塞時可以通過創(chuàng)建另一個線程來解決界面的阻塞問題,例:new Thread(ImageDealThread).Start();將控件所需要處理的事件封裝到一個函數(shù)里面,通過線程進行調(diào)用,跨線程訪問控件可以通過定義一個委托(delegate)來將參數(shù)與方法傳遞給控件所在的線程,再通過Invoke來調(diào)用。文章來源:http://www.zghlxwxcb.cn/news/detail-616772.html
錯誤之處,歡迎大家指出!文章來源地址http://www.zghlxwxcb.cn/news/detail-616772.html
到了這里,關(guān)于C#中錯誤:線程間操作無效,從不是創(chuàng)建控件的線程訪問它。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!