使用调用来访问表单上的文本框

时间:2013-10-22 13:24:15

标签: c# multithreading asynchronous

我正在使用异步读取在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();
                }
        }

    }
}

与明星的部分是我得到例外的部分。我试图使用调用但我没有运气。有人通过调用纠正这部分代码所以我没有得到错误。 感谢。

2 个答案:

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