C 線上程中執行耗時的操作時,如何防止介面凍結介面?

發布 科技 2024-02-25
12個回答
  1. 匿名使用者2024-02-06

    如果介面沒有響應,則說明你的**已經在UI執行緒中,並且在執行結束之前,UI執行緒無法做其他任何事情,自然會無響應。

    如果你確定是你的載入控制代碼執行時間太長,你可以把它放在後台執行緒中來執行

    await ;

    隨後是 UI 的更新。

  2. 匿名使用者2024-02-05

    簡單來說,執行緒與委託沒有直接關係,可以在主線程中開啟子執行緒(UI執行緒是後台**),防止介面卡住,至於委託,一般只需要在需要呼叫委託之前更新子執行緒中的UI。 你可以看一看。 上面的 action(() 是簡單的編寫,不需要委派。

  3. 匿名使用者2024-02-04

    BackGoundWorker 是多執行緒的,一般可以解決。

    worker = new backgroundworker();

    new doworkeventhandler(worker_dowork);

    new runworkercompletedeventhandler(worker_runworkercompleted);

    有兩種方法可以做到這一點,即:

    private void worker_dowork(object sender, doworkeventargs e)

    用於處理需要完成的工作,這是在另乙個執行緒中完成的。

    private void worker_runworkercompleted(object sender, runworkercompletedeventargs e)

    這用於處理處理完成後將在介面中響應的操作。

    如果介面卡住,則只能檢查斷點時間在哪裡。

  4. 匿名使用者2024-02-03

    該程式的假裝死亡和減少響應時間是兩個處理方式不同的概念。

    1、動畫掛起一般只有乙個原因,那就是介面執行緒被阻塞。

    預設情況下,WPF 和 WinForm 應用程式只有乙個執行緒,即 UI 執行緒。 當你給事件寫一些耗時的**時,UI執行緒就會被阻塞,使用者就會反映在“介面卡住了”上。

    解決方案很簡單,使用後台執行緒來處理耗時的任務並保持 UI 執行緒暢通。

    示例:void button1 click(object sender, routedeventargs e)。

    var thread = new => )

    2.減少響應時間。

    這太寬泛了,很難具體回答,一般的業務系統會從兩個方面入手,一是從**優化,減少冗餘**,減少同一事件中的多個互動操作,避免多次查詢等等。

    二是從資料庫優化,這要看資料庫工程師的能力。 簡單的系統可以進行索引和讀寫分離,而更複雜的系統可能需要資料庫工程師構建更好的架構。

  5. 匿名使用者2024-02-02

    多執行緒主要處理這個問題; thread

  6. 匿名使用者2024-02-01

    這個問題的解決方案可以使用多執行緒來完成。

    例如,房東在窗體中放置乙個標籤控制項,編寫乙個 for 迴圈,並將標籤的值從 0 中分配,每秒將該值加 1。 但不管你的邏輯有多好,只要把這個**放在主線程上,那麼表單就會以掛起的動畫狀態出現,直到迴圈完成才會恢復,最後只能看到標籤的最後乙個值。

    子執行緒將執行的方法。

    public void a()

    宣告子執行緒。

    thread t = new thread(new threadstart(a));宣告子執行緒時,它執行的方法必須是無引數且沒有括號的。

    子執行緒開始。

    根據房東的情況,房東可以把a()看作是改變strb值的一種方式,宣告子執行緒,啟動子執行緒,寫在按鈕點選事件中。

    但是需要注意的是,如果房東在子執行緒中更改了主線程的控制項,則在編譯過程中可能會報錯。 這就是使用委託的原因。 給房東寫乙個例子**。

    定義乙個更改控制項屬性的委託。 全域性變數。

    private delegate void delegate1();

    private delegate1 d1;

    定義用於方法執行的子執行緒。

    private thread t;

    定義乙個字串,用於記錄標籤控制項的顯示值。 全域性變數。

    private string state = “除錯”;

    定義乙個 Boolean 值,該值記錄子執行緒的狀態。 全域性變數。

    private bool isstart = false;

    用於顯示狀態。

    public void showstatedelegate()

    public void showstate()

    if(!isstart)

    按鈕單擊事件。

    d1 = new delegate1(showstatedelegate);

    t = new thread(new threadstart(showstate));

    純手寫**,可能會有錯誤,但一般邏輯是這樣的。

  7. 匿名使用者2024-01-31

    方法如下:

    請稍候......";

    funclongtask = new func(delegate()) 進行非同步呼叫,實際上是 in。 在 .net 執行緒池中執行 longtask

    此時,由於其他執行緒都在工作,因此UI執行緒不會被阻塞,因此表單不會假裝= >

    null);

  8. 匿名使用者2024-01-30

    這是因為 button1 click(..當方法被處理時,UI無法重繪(UI重繪和button1 click方法將在同一執行緒中呼叫),因此介面凍結。

    解決方案是將整個 while 迴圈放入非同步程序中(當前 while 迴圈不是非同步呼叫)。

  9. 匿名使用者2024-01-29

    t[i].join(5000);

    這不就是題主自己遮蔽的主線嗎???

    受試者寫的每個子執行緒都告訴主線程:“你阻止我五秒鐘”,現在問為什麼主線程假裝他的死亡???

    而且,lock(new object())這句話除了增加CPU的負擔之外沒有其他目的,感覺主語想加鎖,但實際上每個執行緒鎖的物件不同,這根本就不體現鎖的意思。

  10. 匿名使用者2024-01-28

    你有多少記憶體,把它加到8G試試。

  11. 匿名使用者2024-01-27

    不知道具體原因,但是你的定時器在這裡沒有意義,直接使用迴圈就行了,跟下面類似,Timer2什麼的**都可以刪除,表單載入的時候直接啟動下面的執行緒。

    new thread((threadstart)(delegate);;

    start();

  12. 匿名使用者2024-01-26

    在子執行緒中新增乙個句子; 試一試。

相關回答
4個回答2024-02-25

例如,如果要修改集合,但該集合可能有多個執行緒訪問它。 執行緒對集合進行不同的更改,這可能會導致集合狀態不穩定。 因此,在對集合進行更改時,請為執行緒提供鎖,鎖定它,修改集合,然後釋放鎖,以便其他程序可以繼續訪問該集合而不會出現問題。 >>>More

2個回答2024-02-25

1. MySQL資料庫有幾個配置選項,可以幫助我們及時捕獲低效的SQL語句1、慢查詢日誌 >>>More

11個回答2024-02-25

在C++中,vector被用作容器,其功能是儲存struct型別的變數。 以下是向量的使用方法: >>>More

11個回答2024-02-25

這是文字框,對吧? textbook?

double somedouble; >>>More

6個回答2024-02-25

了解以下規則:1)過載運算子不會改變運算子的優先順序。 >>>More