【发布时间】:2015-06-20 08:26:03
【问题描述】:
所以我正在制作一个 C# 应用程序,它必须连续读取和显示文本文件的内容,同时允许用户在文本框中输入内容并将其附加到该文件的末尾。
我通过在单独的线程上运行我的read 方法来做到这一点,但是更改存储显示文本文件内容的变量是导致问题的原因。最初我尝试使用一种方法来执行此操作,但是这不起作用并给出了“跨线程操作无效”错误。然后我尝试应用我在 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 个动作后终止,没有循环。 -
这是正确的行为,任何与控件相关的数据都必须在 UI 线程上下文中更改,您不能在任何其他线程上执行此操作,因为我在 SetText 方法中看到以下代码将是一个问题- this.OutPut.Text = 文本;您正在尝试在单独的线程上修改 UI 控件
-
@MrinalKamboj -
else部分只有在(递归)调用后才会被命中。这里的SetText方法是正确的。 -
另外 Thread.Join 是在另一个线程正在执行时停止 UI 线程的更好方法,不要使用 While 循环进行轮询。还有为什么不使用TPL,为什么还要依赖线程类来做这项工作
标签: c# multithreading winforms text file-io