应用程序在使用Mono和gtk#的XFCE中崩溃

本文关键字:XFCE 崩溃 gtk# Mono 应用程序 | 更新日期: 2023-09-27 18:04:16

大家好!

我有一个问题,我自己无法解决,谷歌这次没有任何合理的建议。所以这是最后的希望。

我有一个用c#和WPF编写的应用程序,我想把它移植到运行xfce桌面的Debian上。这是使用MonoDevelop和gtk#完成的。该应用程序非常简单——它连接到区域运输公司时刻表提供商的API,并从附近的站点获取下一班车出发。

应用程序现在在Linux中运行,并按预期更新时间表。问题是,它在开始10-60分钟后随机崩溃。没有错误或异常消息。我在日志里找不到任何东西。它只是退出(终止),就是这样。

我有一种预感,这可能在某种程度上与线程或缺乏相关。下面是来自MainWindow方法的主要代码片段。也许社区可以帮助我,发现我是否做错了什么。

谢谢。

private static System.Timers.Timer timer;
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
    Build ();
    uiCustomizations();
    updateTimetable();
    timer = new System.Timers.Timer(180000); 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(updateTimetable);
    timer.Enabled = true;
}
private void updateTimetable (object source = null, ElapsedEventArgs e = null)
{
    try {
        Log.myLog.AddEntry("Downloading timetable");
        ReittiopasConnector ro = new ReittiopasConnector (Parameters.RequestType, Parameters.Stop, Parameters.CurrentTime, Parameters.TimeLimit, Parameters.DepLimit);
        Parser data = new Parser (ro.GetXmlStream ());

        BusDepartures departures132 = new BusDepartures ();
        data.GetBusSchedule (Parameters.Lines [0]);
        departures132.SetDepatures = data.ReturnDepartureTimes ();
        label_Left_Time1.Text = departures132.Departure;
        label_Left_Time2.Text = departures132.FollowingDeparture;
        BusDepartures departures503 = new BusDepartures ();
        data.GetBusSchedule (Parameters.Lines [1]);
        departures503.SetDepatures = data.ReturnDepartureTimes ();
        label_Right_Time1.Text = departures503.Departure;
        label_Right_Time2.Text = departures503.FollowingDeparture;
        //Bus503.DataContext = departures503;
        //}));
    } catch (Exception ex) {
        Log.myLog.AddEntry("Exception: " + ex.Message);
    }
}

应用程序在使用Mono和gtk#的XFCE中崩溃

您需要在同一个线程(主线程,也称为UI线程)中调用GTK/GDK api。然而,从代码来看,你似乎在使用一个计时器,这意味着你可能会从计时器已经启动的派生线程中触摸UI。

因此,您需要使用(例如)包装对GTK/GDK的调用:
    Gtk.Application.Invoke (() => {
          label.Text = "Done";
    });