[问题] 怎知 "方法(函式)" 执行者是谁?

楼主: 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