c# - Gtk.Application.Invoke 不工作

标签 c# multithreading mono monodevelop

我正在尝试使用 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);

中抛出错误

Following is the error

希望很快收到某人的来信。

最佳答案

您确定要在 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/

相关文章:

c# - 使用 ImageSharp 调整色阶和颜色

c# - 当只允许该程序的一个实例时从系统托盘恢复窗口

multithreading - pthread rwlock从不同线程锁定/解锁

c# - 使用 NancyWcfGenericService 运行 Nancy + Mono 时出错

asp.net - Razor View Engine 是否适用于 Mono?

c# - WinForms anchor 控件更改位置来源?

c# - 打开网络浏览器,自动完成表单组件并提交

C# 互操作到除 c\c++ 以外的较低级别

c - 使用线程传输文件

c# - 如何等待线程在 C# 中完成执行?