您的位置: 旅游網 > 影視 >> 票房

    處理多線程程序時的陷阱物業

    發布時間:2021-10-29 05:46:52

    之前談好的工作也將泡湯。“就覺得點燃這些東西是一種發泄 與所有的UI開發平臺一樣,.NET下線程開發圖形界面同樣要遵循一個基本原則:就是對UI對象的操作一定要在產生該UI對象的線程里進行(該線程稱作UI線程),因為大部分UI對象都不是線程安全的。

    在.NET中,把調用調用放在UI線程里執行是通過Form類及其子類的Invoke()方法實現的(具體的過程請參考其他資料),可以這樣做是因為Form對象保存了創建它的線程的信息,而且Form類有一個bool類型的屬性InvokeRequired,可以通過它查看當前線程是否為創建該Form對象的線程(UI線程)——如果為true,則表示當前線程不是UI線程,反之則是。下面提供一個例子:

    using reading;

    using rms;

    namespace csharpTest

    {

    public class TestForm : Form

    {

    private Form form1;

    private Form form2;

    public static void Main()

    {

    TestForm tf = new TestForm();

    ow();

    Thread();

    n();

    }

    public void UIThread()

    {

    form1 = new Form();

    form2 = new Form();

    ow();//這里是關鍵

    ow();

    Thread thread = new Thread(new ThreadStart(WorkerThread));

    art();

    }

    public void WorkerThread()

    {

    if (vokeRequired)

    voke(new MethodInvoker(WorkerThread));

    else

    {

    xt = \"This is from WorkerThread.\";

    }

    }

    protected override void OnClosing(ncelEventArgs e)

    {

    Closing (e);

    it();

    }

    }

    }

    TestForm里有兩個需要注意的方法,UIThread——用來模擬UI線程,WorkerThread——用來模擬用戶線程,UIThread中實例化了成員form1與form2,并調用了它們的Show方法,在WorkerThread中改變form1的Text屬性。請注意WorkerThread里有個技巧, if (vokeRequired) 即如果當前線程不是創建該form2的線程,則將方法通通過過Invoke方法放到UI線程里去執行。但就是這里問題出現了。form1和form2都是在UIThread里建立的,所以它們保存的線程的信息應該是一樣的。所以vokeRquired和vokeRquired的值在任何線程里都是一樣的,即在WorkerThread中InvokeRquire的值都應該是true(因為在不同的線程里)。但是如果注釋掉ow()的話vokeRquired在WorkerThread中的值卻是false(在中調試看到),怎么會這樣呢?而且如果不經過判斷直接在WorkerThread里調用form2對象的Invoke的話…………居然會拋出異常——“在創建窗口句柄之前,不能在控件上調用 Invoke 或 InvokeAsync”分析一下該異常的信息,在win32里每一個窗體都有一個窗體句柄,是該窗體在建立時系統分配的,但我們確實在UI線程里建立了form2對象的。這里有個誤區.Net里的Form對象并不是和win32的窗體對象完全對應的。

    本人竊以為,產生一個Form類的實例時,只是產生了一個內存中的普通的對象,并不產生系統窗體(好像叫做User對象吧),只有它第一次呈現在屏幕上(或稱作創建)時,才產生系統里表示窗體的User對象且分配句柄,對應的WIN32 API的CreateWindow()方法大概也在這個時候執行(先聲明:本人對WIN32 AP 并不熟悉,所以這里如果有什么不妥的話請大家指正)

    只有.NET里的form對象調用某種方法使系統產生真正的窗體時,form才會有創建它的線程的信息,且InvokeRquired才有效,即才能調用form的Invoke方法。不過我還沒弄清楚哪幾個方法可以做到。據我所知Show, CreateGraphics可以產生系統真正的系統窗體。

    成都治療白癜風的醫院
    長沙哪醫院男科好
    貴陽治療婦科醫院哪家好
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 国产欧美日韩精品丝袜高跟鞋| 中文字幕日韩丝袜一区| 中文字幕丝袜制服| 精品精品国产高清a毛片| 欧美综合人人做人人爱| 日本不卡中文字幕| 国模精品一区二区三区视频| 国产国语**毛片高清视频| 亚洲色欲久久久久综合网| 久草香蕉视频在线观看| 久久国产精品一区免费下载| 中国熟妇VIDEOSEXFREEXXXX片| japanese成熟丰满熟妇| 2019国产情侣| 象人族女人能吃得消吗| 窝窝午夜看片七次郎青草视频| 欧美精品手机在线| 日本丰满熟妇BBXBBXHD| 女人18毛片a级毛片| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区四区 国产欧美精品一区二区三区四区 国产欧美精品一区二区色综合 | 曰韩无码无遮挡a级毛片| 护士强迫我闻她的臭丝袜脚| 在线观看中文字幕第一页| 国产在线视频你懂的| 免费啪啪社区免费啪啪手机版| 亚洲a级在线观看| √天堂中文官网8在线| 亚洲另类专区欧美制服| 精品国产自在现线久久| 欧美丰满熟妇xxxx| 成人国产一区二区三区| 国产精品VA无码一区二区| 又粗又紧又湿又爽的视频| 亚洲va韩国va欧美va| 一个人看日本www| 黄色一级毛片看一级毛片| 特级毛片s级全部免费| 日本高清va在线播放| 国产精品网址你懂的| 午夜老司机永久免费看片| 伊人狼人综合网|