我正在尝试使用 Backgroundworker 在 MONO 上构建应用程序。当我使用顺序方法时,我的应用程序运行良好。基本上我的应用程序在单击按钮时在绘图区域上绘制了一些矩形。
我正在尝试比较顺序执行、使用 Backgroundworker 和其他执行时间之间的差异。
我在使用 background worker 时遇到了问题,看看下面的代码,
static void DoWork (object sender, DoWorkEventArgs e)
{
Context ct = (Context)e.Argument;
house.DrawHouse rect = new house.DrawHouse ();
PointD p1, p2, p3, p4;
p1 = new PointD (55, 250);
p2 = new PointD (65, 250);
p3 = new PointD (65, 90);
p4 = new PointD (55, 90);
Gtk.Application.Invoke (delegate {
ct.MoveTo (p1);
ct.LineTo (p2);
ct.LineTo (p3);
ct.LineTo (p4);
ct.LineTo (p1);
ct.ClosePath ();
ct.Color = new Color (0, 0, 0);
ct.FillPreserve ();
ct.Color = new Color (255, 255, 255);
ct.Stroke ();
});
}
}
在上面的代码中,工作线程正在创建矩形并提供给 GUI 线程来打印它。但它在 ct.MoveTo (p1);
中抛出错误
希望很快收到某人的来信。
最佳答案
您确定要在 GUI 线程中调用该代码吗?要找出答案,您可以使用 this tool .
另外,让我猜猜:您是在 Windows 上运行它,是吗?我有这种印象是因为 AccessViolationExceptions 在 MS.NET 上比在 Mono 上更频繁地发生(不知何故,与非托管世界的互操作性在 Mono 上不那么严格)。
这有时会在错误中提出,但尚未修复。在 MS.NET 中,这些问题通常可以通过应用适当的调用约定来解决。一个例子是 this ,也许你错过了其中的一些? (或者 Cairo 的绑定(bind)?一定要克隆 gtk-sharp 并查看正在调用的 DllImport;也许您可以在那里发现错误并发送拉取请求来修复它?)
关于c# - Gtk.Application.Invoke 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12367036/