我需要通过参数将Graphics对象传递给线程启动方法,但是由于某种原因它会使它无效并抛出ArgumentException:参数无效。
问题的简化视图:
private void Canvas_Paint(object sender, PaintEventArgs e)
{
Start(e.Graphics);
}
public void Start(Graphics g)
{
new Thread(new ParameterizedThreadStart(Render)).Start(g);
}
private void Render(object g)
{
((Graphics)g).DrawRectangle(Pens.Red, 50, 50, 50, 50);
}
答案 0 :(得分:1)
这种情况正在发生,因为在事件处理程序中获取的Graphics对象是临时的,并在后台线程执行时被处置。
相反,您应该将控件传递给后台线程。
此外,您应该使用System.ComponentModel.AsyncOperationManager
来保护安全,而不是后台线程:
private void Canvas_Paint(object sender, PaintEventArgs e)
{
Start((Control)sender);
}
public void Start(Control uiControl)
{
AsyncOperation asyncOperation = AsyncOperationManager.CreateOperation(null);
asyncOperation.Post(Render, uiControl);
}
private void Render(object g)
{
((Control)g).CreateGraphics().DrawRectangle(Pens.Red, 50, 50, 50, 50);
}