-
如果介面沒有響應,則說明你的**已經在UI執行緒中,並且在執行結束之前,UI執行緒無法做其他任何事情,自然會無響應。
如果你確定是你的載入控制代碼執行時間太長,你可以把它放在後台執行緒中來執行
await ;
隨後是 UI 的更新。
-
簡單來說,執行緒與委託沒有直接關係,可以在主線程中開啟子執行緒(UI執行緒是後台**),防止介面卡住,至於委託,一般只需要在需要呼叫委託之前更新子執行緒中的UI。 你可以看一看。 上面的 action(() 是簡單的編寫,不需要委派。
-
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)
這用於處理處理完成後將在介面中響應的操作。
如果介面卡住,則只能檢查斷點時間在哪裡。
-
該程式的假裝死亡和減少響應時間是兩個處理方式不同的概念。
1、動畫掛起一般只有乙個原因,那就是介面執行緒被阻塞。
預設情況下,WPF 和 WinForm 應用程式只有乙個執行緒,即 UI 執行緒。 當你給事件寫一些耗時的**時,UI執行緒就會被阻塞,使用者就會反映在“介面卡住了”上。
解決方案很簡單,使用後台執行緒來處理耗時的任務並保持 UI 執行緒暢通。
示例:void button1 click(object sender, routedeventargs e)。
var thread = new => )
2.減少響應時間。
這太寬泛了,很難具體回答,一般的業務系統會從兩個方面入手,一是從**優化,減少冗餘**,減少同一事件中的多個互動操作,避免多次查詢等等。
二是從資料庫優化,這要看資料庫工程師的能力。 簡單的系統可以進行索引和讀寫分離,而更複雜的系統可能需要資料庫工程師構建更好的架構。
-
多執行緒主要處理這個問題; thread
-
這個問題的解決方案可以使用多執行緒來完成。
例如,房東在窗體中放置乙個標籤控制項,編寫乙個 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));
純手寫**,可能會有錯誤,但一般邏輯是這樣的。
-
方法如下:
請稍候......";
funclongtask = new func(delegate()) 進行非同步呼叫,實際上是 in。 在 .net 執行緒池中執行 longtask
此時,由於其他執行緒都在工作,因此UI執行緒不會被阻塞,因此表單不會假裝= >
null);
-
這是因為 button1 click(..當方法被處理時,UI無法重繪(UI重繪和button1 click方法將在同一執行緒中呼叫),因此介面凍結。
解決方案是將整個 while 迴圈放入非同步程序中(當前 while 迴圈不是非同步呼叫)。
-
t[i].join(5000);
這不就是題主自己遮蔽的主線嗎???
受試者寫的每個子執行緒都告訴主線程:“你阻止我五秒鐘”,現在問為什麼主線程假裝他的死亡???
而且,lock(new object())這句話除了增加CPU的負擔之外沒有其他目的,感覺主語想加鎖,但實際上每個執行緒鎖的物件不同,這根本就不體現鎖的意思。
-
你有多少記憶體,把它加到8G試試。
-
不知道具體原因,但是你的定時器在這裡沒有意義,直接使用迴圈就行了,跟下面類似,Timer2什麼的**都可以刪除,表單載入的時候直接啟動下面的執行緒。
new thread((threadstart)(delegate);;
start();
-
在子執行緒中新增乙個句子; 試一試。
例如,如果要修改集合,但該集合可能有多個執行緒訪問它。 執行緒對集合進行不同的更改,這可能會導致集合狀態不穩定。 因此,在對集合進行更改時,請為執行緒提供鎖,鎖定它,修改集合,然後釋放鎖,以便其他程序可以繼續訪問該集合而不會出現問題。 >>>More