我如何在线程中运行mouse_move事件…
本文关键字:mouse move 事件 运行 线程 | 更新日期: 2023-09-27 18:05:08
我的应用程序从电子设备中绘制值。它在一秒钟内绘制10个值。它在获取下一个值之前等待100ms。等待是由Thread.Sleep(100);
给出的,这部分工作良好。
我正在显示鼠标在MouseMove事件中的位置。但是为了显示这个位置,我需要延迟一下,我之前说过。
所以我想避免延迟。我试图在线程中运行MouseMove事件,如new Thread(chartControl1_MouseMove).Start();
。但是它给出了以下错误:
- 匹配的最佳重载方法'System.Threading.Thread.Thread(System.Threading.ThreadStart)'有一些无效的参数。
- 参数'1':无法从'method group'转换为'System.Threading.ThreadStart'
什么建议…? ?
MouseMove事件接受一些参数。但是线程开始并没有传递它们。它假设该方法有void参数。
这是因为我采取的方法chartControl1_MouseMove
被声明为
public void chartControl1_MouseMove(object sender,MouseEventArgs e)
不能转换为
形式的ThreadStart
委托。public delegate void ThreadStart()
要做到这一点,你需要创建一个自己的方法,返回类型为void,没有像
这样的参数。private void foo()
并将代码行更改为:
new Thread(foo).Start();
这样至少可以编译。然后,您必须在foo
方法中实现所需的行为。
您正在使用需要参数的方法。要么将方法更改为没有参数,要么使用工作项:
ThreadPool.QueueUserWorkItem(o => Method(m));
您需要将您的方法chartControl1_MouseMove(object sender, MouseEventArgs e)
转换为包含一个参数的东西,或者您可以恢复使用任务代替。一般来说,最好将工作代码放在它自己的方法中,让事件就是事件(如果在表单中已经异步调用了)。然后从事件中调用工作方法(将其排队)。
使用线程池比使用线程有很多优点,参见这篇文章
使用parameterizedThreadStart或最好将mouse_move处理程序的主体移动到其他方法,并在线程上运行该方法