Итак, я делаю приложение C#, которое должно непрерывно читать и отображать содержимое текстового файла, позволяя пользователю вводить что-то в текстовое поле и добавлять его в конец это очень файл.Невозможно изменить переменные из отдельного потока
Я делаю это, запустив мой метод read
в отдельном потоке, однако изменение переменной, которая хранит содержимое текстовых файлов дисплея, вызывает проблемы. Первоначально я пробовал использовать метод, который сделал это, однако это не работает и дало ошибку «cross-thread-operation-not-valid». Затем я попытался применить некоторый код, который я нашел в MSDN, но теперь после обновления переменной после завершения потока!
Пожалуйста, помогите.
partial class MainForm
{
delegate void SetTextCallback(string text);
public static string msg;
public static string name;
public void InitClient()
{
name = "public.txt";
Console.WriteLine(name);
if(!File.Exists(name))
{
File.Create(name);
File.AppendAllText(name, "Welcome to " + name);
}
Thread Read = new Thread(new ThreadStart(this.Client));
Read.Start();
while(!Read.IsAlive);
}
public void WriteText()
{
File.AppendAllText(name, this.InputBox.Text);
this.InputBox.Clear();
}
private void SetText(string text)
{
if (this.OutPut.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.OutPut.Text = text;
}
}
public void Client()
{
msg = File.ReadAllText(name);
Console.WriteLine(msg);
Thread.Sleep(300);
this.SetText(msg);
}
}
Почему так ведет себя эта нить. Как изменить код, чтобы содержимое окна вывода всегда равнялось содержимому текстового файла.
Любые предложения приветствуются.
'Client()' - метод с одним выстрелом. Конечно, он завершится после 1 действия, нет петли. –
Это правильное поведение, любые связанные с контролем данные должны быть изменены в контексте потока пользовательского интерфейса, вы не можете сделать это ни на одном другом потоке, здесь, как я вижу, следующий код в методе SetText будет проблемой - this.OutPut.Текст = текст; вы пытаетесь изменить элемент управления пользовательского интерфейса в отдельном потоке –
@MrinalKamboj - эта часть 'else' будет удалена только после того, как она была (рекурсивно) вызвана. Метод SetText здесь правильный. –