[問題] 怎知 "方法(函式)" 執行者是誰?

作者: s4300026 (s4300026)   2018-09-12 15:20:44
C# 的各位先進好
小弟最近在使用backgroundworker做背景執行
假設主執行序執行Form
我想知道以下認知是否正確,或是可以有什麼方法可以知道是誰在做事情?
1. 主執行序的視窗類別的子類別直接執行某方法 是由 主執行序執行該方法
2. 主執行序的視窗類別的子類別的某方法 做成委派變數 給背景執行序執行
是由 主執行序執行該方法
delegate void MyMethod (void);
MyMethod method = subClassMethod;
void Scanner_DoWork(object sender, DoWorkEventArgs e)
{
method();
}
3. 承2.,但是給背景執行序委派 是由 主執行序執行 委派方法
void Scanner_DoWork(object sender, DoWorkEventArgs e)
{
method.Invoke();
}
作者: Litfal (Litfal)   2018-09-12 15:30:00
DoWork事件是由非視窗執行緒觸發執行ProgressChanged 是由視窗執行緒執行要用 backgroundworker,遵守這個原則會比較清楚2、3是一樣的在DoWork裡面寫個無限迴圈去撈資料,拿到想顯示的資料後,用 ReportProgress() 去觸發 ProgressChanged,在事件裡面再去調整UI
作者: DeathTemp (邦迪亞的小金魚)   2018-09-12 23:01:00
試試看不要直接送出指令給RS232,而是先放在一個Queue裡面,等到收完上個指令的回覆或者你定義的timeout後再送出下一筆指令,如果這樣收資料就正常的話,那就是證實你的懷疑沒錯了
作者: Litfal (Litfal)   2018-09-13 12:21:00
SerialPort.DataReceived 是從ThreadPool抓一個閒置的執行緒來raise,跟你註冊的執行緒無關
作者: s4300026 (s4300026)   2018-09-14 18:02:00
不是,我想表達的意思是目前寫法是送收分離的我現在正在改成deathtemp的方法,雖然可能可以解決問題,但是我還是不明白要怎麼知道是哪個thread執行哪個方法啊! 舉例來說我會好奇litfal說的,為什麼backgroundworker可以做到dowork事件是一個執行序,progresschange是另一個執行序
作者: Litfal (Litfal)   2018-09-15 10:39:00
System.Threading.Thread.CurrentThread.ManagedThreadId元件的細節就是靠經驗和看文件BackgroundWorker設計上就是給WinForm做非同步用的,當然就會有耗時工作工作DoWork,由非視窗執行緒做,避免卡死UI以及ProgressChanged顯示進度用,由視窗執行緒做,可以直接調整UI控制項。
作者: s4300026 (s4300026)   2018-09-15 15:32:00
原來真的有阿!!太好了,這樣就可以好好找問題了感謝litfal
作者: DeathTemp (邦迪亞的小金魚)   2018-09-16 00:31:00
其實RS232 Device在上一筆指令還沒處理完,又接到新指令的時候,直接忽視新指令是很常見的做法

Links booklink

Contact Us: admin [ a t ] ucptt.com