Gtk # довольно темпераментный и не очень хорошо работает с потоками, связанными с потоком пользовательского интерфейса (основным). Кроме того, вы не можете обновить пользовательский интерфейс из вторичного потока (это является общим для всех графических инструментов).
Если я правильно понял вашу проблему, вы можете просто использовать System.Threading, чтобы поспать секунду. Проблема в том, что если вы это сделаете, ваше приложение не будет отвечать на запросы в течение всей этой секунды.
Решение состоит в том, чтобы активно ждать, пока не пройдет секунда. Это менее точно, чем ожидание ровно секунды, но я надеюсь, что оно удовлетворит ваши потребности.
Вот код, который вам нужен:
void ActivelyWaitFor(long targetMillis)
{
var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
while( stopWatch.ElapsedMilliseconds < targetMillis ) {
Gtk.Application.RunIteration();
}
stopWatch.Stop();
}
Gtk может выполнить итерацию и возврат (Gtk.Application.RunIteration ()), что здесь очень удобно. Мы можем повторить это, чтобы предложить отзывчивый пользовательский интерфейс, пока мы ждем, пока пройдет время.
А вот и весь код для окна, выполняющего нужную вам задачу, на случай, если у вас возникнут сомнения относительно того, как его использовать.
public class MainWindow: Gtk.Window
{
public MainWindow()
:base(Gtk.WindowType.Toplevel)
{
this.Build();
this.DeleteEvent += (o, evt) => Gtk.Application.Quit();
this.Shown += (o, args) => this.DisplayText();
}
void Build()
{
this.TextView = new Gtk.TextView();
this.Add( this.TextView );
}
void DisplayText()
{
string[] ScoreBoard = new string[4];
Gtk.TextIter Ti = this.TextView.Buffer.StartIter;
string[] Temp = {
"1\t2\t3\t4",
"1\t2\t3\t4",
"1\t2\t3\t4",
"1\t2\t3\t4",
"1\t2\t3\t4",
"1\t2\t3\t4",
};
foreach (string Line in Temp)
{
ScoreBoard = Line.Split('\t');
this.ActivelyWaitFor( 1000 );
this.TextView.Buffer.Insert(ref Ti, ScoreBoard[0]);
this.TextView.Buffer.Insert(ref Ti, " | ");
this.TextView.Buffer.Insert(ref Ti, ScoreBoard[1]);
this.TextView.Buffer.Insert(ref Ti, "\t");
this.TextView.Buffer.Insert(ref Ti, ScoreBoard[2]);
this.TextView.Buffer.Insert(ref Ti, " | ");
this.TextView.Buffer.Insert(ref Ti, ScoreBoard[3]);
this.TextView.Buffer.Insert(ref Ti, "\n");
}
}
void ActivelyWaitFor(long targetMillis)
{
var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
while( stopWatch.ElapsedMilliseconds < targetMillis ) {
Gtk.Application.RunIteration();
}
stopWatch.Stop();
}
private Gtk.TextView TextView;
}
Надеюсь, это поможет.