2

我正在尝试使用 Backgroundworker 在 MONO 上构建应用程序。当我使用顺序方法时,我的应用程序运行良好。基本上,我的应用程序在单击按钮时在绘图区域上绘制一些矩形。

我正在尝试使用 Backgroundworker 和其他方法比较顺序执行时间的差异。

我在使用后台工作者时遇到问题,请查看以下代码,

    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) 中引发错误;

以下是错误

希望很快能听到一些人的消息。

4

2 回答 2

1

您确定要在 GUI 线程中调用该代码吗?要找出答案,您可以使用此工具

另外,让我猜一下:你在 Windows 上运行它,不是吗?我有这个印象是因为 AccessViolationExceptions 在 MS.NET 上比在 Mono 上更频繁地发生(不知何故,与非托管世界的互操作性在 Mono 上不那么严格)。

这有时会在错误中提出,但尚未修复。在 MS.NET 中,这些问题通常可以通过应用适当的调用约定来解决。一个例子是这个,也许你错过了一些?(或者 Cairo 的绑定?一定要克隆gtk-sharp并查看被调用的 DllImport;也许你可以在那里发现一个错误并发送一个拉取请求来修复它?)

于 2012-09-11T21:39:47.300 回答
0

你是对的。是的,我在 Windows 上运行它。对于您的第一点,工作线程将启动任务并创建矩形并提供给 GUI 线程以将其打印在屏幕上。(Gtk.Application.Invoke (delegate { }); 这将切换到 GUI 线程)

看看下面的代码我正在做同样的事情,但不是从绘画的角度来看,但它做了一些耗时的计算。耗时的计算由工作线程完成,并将结果提供给 GUI 线程以在 UI 上打印。这对我来说绝对可以正常工作,没有任何错误。

void DoWork (object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    var watch = Stopwatch.StartNew ();

    for (int i = lowerLimit; i <= upperLimit; i++) {
        int j = i;
        var result = SumRootN (j);
        Gtk.Application.Invoke (delegate {
            textview15.Buffer.Text += "root " + j.ToString () + " = " + result.ToString () + Environment.NewLine;
        });
        worker.ReportProgress ((int)(((double)i / (double)upperLimit) * 100));
    }
    var time = watch.ElapsedMilliseconds;
    textview20.Buffer.Text = "Background Worker: \n execution took " + time + " MS to \n complete the execution \n SLOW & RESPONSIVE"; 
}

但是,如果我在绘画上做同样的事情,它会给我上面附加的错误。

如果我错了请纠正我

感谢您的回复knocte,我会看看您的回复。

于 2012-09-12T03:00:12.310 回答