【发布时间】:2019-02-13 05:50:30
【问题描述】:
我期待在我的程序中添加鼠标位置检查模块。
UI有两个Textbox来打印X和Y。它应该异步打印光标位置。
我尝试了BeginInvoke/Invoke,Thread.isBackgroud = true,BackgroundWorker,但这些都没有帮助。
Thread/BackgroundWorker 不断发生
跨线程错误(如预期),
并且BeginInvoke/Invoke 有异步问题:UI 线程一直死机。
我也尝试了mousemove 事件,这可行,但是当光标超出表单边界时,位置跟踪停止。
delegate void MP();
private void tracktoggle() {
MP mp = printMousePosition;
BeginInvoke(mp); // Or Invoke(mp);
}
private void printMousePosition() {
while(true) {
this.Xtext.Text = Mouseposition.X.ToString();
this.Ytext.Text = Mouseposition.Y.ToString();
}
}
此代码使 UI 线程处于阻塞状态。
private async void tracktoggle() {
Task T = new Task(() => { printMousePosition(); });
await T;
}
private void printMousePosition() {
while(true) {
this.Xtext.Text = Mouseposition.X.ToString();
this.Ytext.Text = Mouseposition.Y.ToString();
}
}
这是带有 async/await 的代码。不会阻塞 UI 线程,但文本框没有得到更新。 我认为 BeginInvoke 是 Invoke 的异步版本 :( 不起作用
希望在不阻塞 UI 线程的情况下异步打印鼠标位置。
【问题讨论】:
-
printMousePosition()中的无限while循环,你BeginInvoke只会导致 UI 完全冻结。您可能希望用报告进度的BackgroundWorker替换您的设计。更容易 -
ㄴ 谢谢,我会用 BackgroundWorker 集重试
-
虽然
BeginInvoke是异步的,但你是对的。但是,它最终调用的任何方法都不能是无限循环。它必须给 UI 一个自我更新的机会 -
ㄴ 哦.. 好的,我明白了
-
how to run background Thread that needs to access to ui thread你可以使用异步等待模式,它会处理延续。
标签: c# .net multithreading winforms