C_Sharp 板


LINE

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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1536736847.A.DE1.html ※ 編輯: s4300026 (60.250.235.221), 09/12/2018 15:22:37
1F:推 Litfal: DoWork事件是由非視窗執行緒觸發執行 09/12 15:30
2F:→ Litfal: ProgressChanged 是由視窗執行緒執行 09/12 15:31
3F:→ Litfal: 要用 backgroundworker,遵守這個原則會比較清楚 09/12 15:31
4F:→ Litfal: 2、3是一樣的 09/12 15:32
5F:→ Litfal: 在DoWork裡面寫個無限迴圈去撈資料,拿到想顯示的資料後, 09/12 15:35
6F:→ Litfal: 用 ReportProgress() 去觸發 ProgressChanged,在事件裡面 09/12 15:35
7F:→ Litfal: 再去調整UI 09/12 15:35
感謝您的熱心回覆~~~ 話說你的回答讓我想起之前一直也想問的問題 事件管理者(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
8F:推 DeathTemp: 試試看不要直接送出指令給RS232,而是先放在一個Queue 09/12 23:01
9F:→ DeathTemp: 裡面,等到收完上個指令的回覆或者你定義的timeout後 09/12 23:02
10F:→ DeathTemp: 再送出下一筆指令,如果這樣收資料就正常的話,那就是 09/12 23:02
11F:→ DeathTemp: 證實你的懷疑沒錯了 09/12 23:03
12F:推 Litfal: SerialPort.DataReceived 是從ThreadPool抓一個閒置的執行 09/13 12:21
13F:→ Litfal: 緒來raise,跟你註冊的執行緒無關 09/13 12:22
14F:→ s4300026: 不是,我想表達的意思是目前寫法是送收分離的 09/14 18:02
15F:→ s4300026: 我現在正在改成deathtemp的方法,雖然可能可以解決問題 09/14 18:06
16F:→ s4300026: ,但是我還是不明白要怎麼知道是哪個thread執行哪個方法 09/14 18:06
17F:→ s4300026: 啊! 舉例來說我會好奇litfal說的,為什麼backgroundwor 09/14 18:06
18F:→ s4300026: ker可以做到dowork事件是一個執行序,progresschange是 09/14 18:06
19F:→ s4300026: 另一個執行序 09/14 18:06
20F:推 Litfal: System.Threading.Thread.CurrentThread.ManagedThreadId 09/15 10:39
21F:→ Litfal: 元件的細節就是靠經驗和看文件 09/15 10:41
22F:→ Litfal: BackgroundWorker設計上就是給WinForm做非同步用的,當然 09/15 10:42
23F:→ Litfal: 就會有耗時工作工作DoWork,由非視窗執行緒做,避免卡死UI 09/15 10:44
24F:→ Litfal: 以及ProgressChanged顯示進度用,由視窗執行緒做,可以直 09/15 10:45
25F:→ Litfal: 接調整UI控制項。 09/15 10:45
26F:→ s4300026: 原來真的有阿!!太好了,這樣就可以好好找問題了 09/15 15:32
27F:→ s4300026: 感謝litfal 09/15 15:32
28F:推 DeathTemp: 其實RS232 Device在上一筆指令還沒處理完,又接到新指 09/16 00:31
29F:→ DeathTemp: 令的時候,直接忽視新指令是很常見的做法 09/16 00:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP