C# 非调试模式下的线程使用和绘图问题
我正在使用Visual Studio 2012,用c#编写。我的程序有一个在后台运行的采集线程。事情是这样的: 在线程内部:C# 非调试模式下的线程使用和绘图问题,c#,multithreading,debugging,drawing,visual-studio-debugging,C#,Multithreading,Debugging,Drawing,Visual Studio Debugging,我正在使用Visual Studio 2012,用c#编写。我的程序有一个在后台运行的采集线程。事情是这样的: 在线程内部: public void myAcquisitionTask(object o) { while(ThreadAlive) { // Collect data System.Threading.Thread.Sleep(100); } } 并呼吁: Thread myThread; myThread.start(da
public void myAcquisitionTask(object o)
{
while(ThreadAlive)
{
// Collect data
System.Threading.Thread.Sleep(100);
}
}
并呼吁:
Thread myThread;
myThread.start(data);
在我的GUI中,我有一个可单击的按钮,当单击时,它会绘制一些数据(作为图形
对象)。基本上是一些线路,但有很多线路(大约50000条)。绘制过程如下所示:
private void btnDisplaySavedData_Click(object sender, EventArgs e)
{
Graphics graphicsObj = myDisplay.CreateGraphics();
// Do for multiple lines
graphicsObj.DrawLine(pen, startpt, endpt);
graphicsObj.Dispose();
}
我意识到当线程运行时,图形
对象将绘制;但是,正如绘图完成一样,它将被擦除
有趣的是,这种行为只发生在非调试模式下(VisualStudio中的ctrl-f5),而从不发生在调试模式下。此外,我意识到,如果我不在非调试模式下调用myThread.start()
,绘图也能正常工作
这让我相信,线和画之间是有关系的。有人知道可能的原因吗?请澄清什么是
myThread
myThread
是线程
类的对象实例。为了清楚起见,我已经编辑了我的问题。你能发布一篇文章吗?这样我们就可以看到和你看到的相同的问题了。根据你提到的Graphics
我假设这是Winforms。在Winforms中绘制的唯一正确方法是处理Paint
事件(在子类中使用处理程序或重写OnPaint()
),并基于数据的某些当前状态进行绘制。您没有提供足够的代码示例,但很可能猜测您没有这样做,而只是执行类似于调用CreateGraphics()
并在单击按钮时绘制的操作。它在调试模式下工作只是一个巧合。这也很容易失败。结果表明,没有在OnPaint()中绘制导致了该问题。