我正在使用异步读取在C#中编写一个简单的文件流程序,它使用主线程以外的线程进行回调。但是当我尝试在文本框中编写我的filecontent时,我遇到了跨线程异常。 这是我的计划:
using System;
namespace Filestream
{
public partial class Form1 : Form
{
FileStream fs;
byte[] fileContents;
AsyncCallback callback;
public Form1()
{
InitializeComponent();
}
private void synbtn_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
callback = new AsyncCallback(fs_StateChanged);
fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
fileContents = new Byte[fs.Length];
fs.BeginRead(fileContents, 0, (int)fs.Length, callback, null);
}
public void fs_StateChanged(IAsyncResult ar)
{
if (ar.IsCompleted)
{
*textBox1.Text = Encoding.UTF8.GetString(fileContents);*
fs.Close();
}
}
}
}
与明星的部分是我得到例外的部分。我试图使用调用但我没有运气。有人通过调用纠正这部分代码所以我没有得到错误。 感谢。
答案 0 :(得分:1)
试试这个。
if(textbox1.InvokeRequired)
{
textbox1.Invoke(new MethodInvoker(() => textBox1.Text = Encoding.UTF8.GetString(fileContents)));
}
else
{
textBox1.Text = Encoding.UTF8.GetString(fileContents);
}
答案 1 :(得分:0)
扩展Ram的回答
//Can this thread make updates to textbox1?
if(textbox1.InvokeRequired)
{
//No then use the invoke method to update textbox1
textbox1.Invoke(new MethodInvokernew MethodInvoker(() => textBox1.Text = Encoding.UTF8.GetString(fileContents)));
}else{
//Yes then update textbox1
textBox1.Text = Encoding.UTF8.GetString(fileContents);
}
说明: 必须在创建UI控件的线程上更新UI控件。要测试当前线程是否允许更新特定UI控件,请调用控件上的InvokeRequired方法。然后可以使用Invoke调用方法来使用可以更新控件的线程