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

看板C_Sharp作者 (s4300026)時間5年前 (2018/09/12 15:20), 5年前編輯推噓5(5024)
留言29則, 3人參與, 5年前最新討論串1/1
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(); } ------------ 然後我還想知道 2.3 的差異性... 使用情境,我現在有個 RS232 傳輸裝置 當我送出訊息給對方後,對方會回傳給我對應的資料 目前的情況是我有兩種狀況都要傳訊息: 1. 常態性背景掃描 2. 我的特殊要求 我在想,如果傳輸方法都是同一個執行序在執行 那我就不用費心去把方法鎖住 System.Threading.AutoResetEvent unLocker; 但如果執行者是不同執行序 我就要考慮 RS232 當下有沒有在執行 write的方法 不然我是否會遺失訊息 PS:目前我發現常常我的要求被 "忽視",我在想到底是哪個環節出問題... 感謝大家聆聽~~~ 謝謝大家~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.235.221 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1536736847.A.DE1.html ※ 編輯: s4300026 (60.250.235.221), 09/12/2018 15:22:37

09/12 15:30, 5年前 , 1F
DoWork事件是由非視窗執行緒觸發執行
09/12 15:30, 1F

09/12 15:31, 5年前 , 2F
ProgressChanged 是由視窗執行緒執行
09/12 15:31, 2F

09/12 15:31, 5年前 , 3F
要用 backgroundworker,遵守這個原則會比較清楚
09/12 15:31, 3F

09/12 15:32, 5年前 , 4F
2、3是一樣的
09/12 15:32, 4F

09/12 15:35, 5年前 , 5F
在DoWork裡面寫個無限迴圈去撈資料,拿到想顯示的資料後,
09/12 15:35, 5F

09/12 15:35, 5年前 , 6F
用 ReportProgress() 去觸發 ProgressChanged,在事件裡面
09/12 15:35, 6F

09/12 15:35, 5年前 , 7F
再去調整UI
09/12 15:35, 7F
感謝您的熱心回覆~~~ 話說你的回答讓我想起之前一直也想問的問題 事件管理者(event Eventhandler) 掛勾 事件響應方法 comPort.DataReceived += ComPort_DataReceived; 當事件發生(raise)後,事件響應方法是哪個執行序在執行的? raise的執行序要做事,還是監聽的執行序要做事 (就名詞而言好像監聽的執行序要做事比較合理... 是嗎?) 離題了... 話說我之前沒想過用ProgressChanged,是因為我覺得用不到 我的理由是 因為 comPort.DataReceived += ComPort_DataReceived; 掛上去後 我就已經可以直接收到資料了,然後就可以直接更新我的資料了。 那就不用ProgressChanged了阿... (也想不到怎麼用) 更直白地說,backgroundworker 只負責發送不負責接收阿... ※ 編輯: s4300026 (60.250.235.221), 09/12/2018 17:08:15

09/12 23:01, 5年前 , 8F
試試看不要直接送出指令給RS232,而是先放在一個Queue
09/12 23:01, 8F

09/12 23:02, 5年前 , 9F
裡面,等到收完上個指令的回覆或者你定義的timeout後
09/12 23:02, 9F

09/12 23:02, 5年前 , 10F
再送出下一筆指令,如果這樣收資料就正常的話,那就是
09/12 23:02, 10F

09/12 23:03, 5年前 , 11F
證實你的懷疑沒錯了
09/12 23:03, 11F

09/13 12:21, 5年前 , 12F
SerialPort.DataReceived 是從ThreadPool抓一個閒置的執行
09/13 12:21, 12F

09/13 12:22, 5年前 , 13F
緒來raise,跟你註冊的執行緒無關
09/13 12:22, 13F

09/14 18:02, 5年前 , 14F
不是,我想表達的意思是目前寫法是送收分離的
09/14 18:02, 14F

09/14 18:06, 5年前 , 15F
我現在正在改成deathtemp的方法,雖然可能可以解決問題
09/14 18:06, 15F

09/14 18:06, 5年前 , 16F
,但是我還是不明白要怎麼知道是哪個thread執行哪個方法
09/14 18:06, 16F

09/14 18:06, 5年前 , 17F
啊! 舉例來說我會好奇litfal說的,為什麼backgroundwor
09/14 18:06, 17F

09/14 18:06, 5年前 , 18F
ker可以做到dowork事件是一個執行序,progresschange是
09/14 18:06, 18F

09/14 18:06, 5年前 , 19F
另一個執行序
09/14 18:06, 19F

09/15 10:39, 5年前 , 20F
System.Threading.Thread.CurrentThread.ManagedThreadId
09/15 10:39, 20F

09/15 10:41, 5年前 , 21F
元件的細節就是靠經驗和看文件
09/15 10:41, 21F

09/15 10:42, 5年前 , 22F
BackgroundWorker設計上就是給WinForm做非同步用的,當然
09/15 10:42, 22F

09/15 10:44, 5年前 , 23F
就會有耗時工作工作DoWork,由非視窗執行緒做,避免卡死UI
09/15 10:44, 23F

09/15 10:45, 5年前 , 24F
以及ProgressChanged顯示進度用,由視窗執行緒做,可以直
09/15 10:45, 24F

09/15 10:45, 5年前 , 25F
接調整UI控制項。
09/15 10:45, 25F

09/15 15:32, 5年前 , 26F
原來真的有阿!!太好了,這樣就可以好好找問題了
09/15 15:32, 26F

09/15 15:32, 5年前 , 27F
感謝litfal
09/15 15:32, 27F

09/16 00:31, 5年前 , 28F
其實RS232 Device在上一筆指令還沒處理完,又接到新指
09/16 00:31, 28F

09/16 00:32, 5年前 , 29F
令的時候,直接忽視新指令是很常見的做法
09/16 00:32, 29F
文章代碼(AID): #1RcBvFtX (C_Sharp)