美好的一天!
我有一个问题,我无法弄明白自己,谷歌这次没有任何合理的建议。所以这是最后的希望。
我有一个用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);
}
}
答案 0 :(得分:1)
您需要在同一个线程(主线程,也称为UI线程)内调用GTK / GDK API。但是,从代码中可以看出您正在使用Timer,这意味着您可能会从计时器已启动的衍生线程中触摸UI。
因此,您需要使用(例如):
将您的调用包装到GTK / GDK Gtk.Application.Invoke (() => {
label.Text = "Done";
});
更多信息here。