-1

我正在使用异步读取在 C# 中编写一个简单的文件流程序,该程序使用主线程以外的线程进行回调。但是当我尝试在文本框中写入文件内容时出现跨线程异常。这是我的程序:

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();
                }
        }

    }
}

带星号的部分是我得到异常的部分。我尝试使用调用,但我没有运气。有人可以用调用更正这部分代码,这样我就不会得到错误。谢谢。

4

2 回答 2

1

尝试这个。

if(textbox1.InvokeRequired)
{
    textbox1.Invoke(new MethodInvoker(() => textBox1.Text = Encoding.UTF8.GetString(fileContents)));
}
else
{
    textBox1.Text = Encoding.UTF8.GetString(fileContents);
}
于 2013-10-22T13:34:00.893 回答
0

扩大拉姆的答案

//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 调用使用可以更新控件的线程的方法

于 2013-10-22T14:09:23.117 回答