带有Graphics C#的ParameterizedThreadStart中的ArgumentException

时间:2015-11-10 23:40:45

标签: c# .net multithreading graphics

我需要通过参数将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);
}

1 个答案:

答案 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);
}