繁体   English   中英

Winforms中的后台工作者未更新文本框

[英]Background Worker In Winforms Not Updating TextBox

我试图使用后台工作程序,以便将取消按钮添加到我的winform中。

我添加了以下语法,但是文本框从未像尝试实现后台工作程序之前那样以任何进度进行更新。

public Form1()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
    {
        string resourceName = new AssemblyName(args.Name).Name + ".dll";
        string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
        {
            Byte[] assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        }
    };
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true;  
    backgroundWorker1.WorkerSupportsCancellation = true;
}
private void btnQuery_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

        //Iterating the array
        foreach (string s in sxc)
        {
            txt_ProgressDetails.Visible = true;
            AppendTextBoxLine("Getting Data For " + s);

            //Put data into DataTable
            PopulateDT(s);
        }

        //If the cancel button was pressed
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
}

    private void AppendTextBoxLine(string statusMessage)
    {
        if (txt_ProgressDetails.Text.Length > 0)
            txt_ProgressDetails.AppendText(Environment.NewLine);
        txt_ProgressDetails.AppendText(statusMessage);
    }

BackgroundWorker的Do_Work事件在非STA线程中运行,您无法从那里更新UI。 您可以重写代码,以使用InvokeRequredInvoke方法更新创建UI元素的线程。

将此添加到您的表单:

delegate void UpdateUICallback(string statusMessage);

并将您的AppendTextBoxLine方法更改为:

if (InvokeRequired)
{
    UpdateUICallback d = new UpdateUICallback(AppendTextBoxLine);
    this.Invoke(d, new object[] {statusMessage});
}
else
{
    if (txt_ProgressDetails.Text.Length > 0)
            txt_ProgressDetails.AppendText(Environment.NewLine);
    txt_ProgressDetails.AppendText(statusMessage);
}

因此您的代码将如下所示:

public Form1()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
    {
        string resourceName = new AssemblyName(args.Name).Name + ".dll";
        string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
        {
            Byte[] assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        }
    };
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true;  
    backgroundWorker1.WorkerSupportsCancellation = true;
}
private void btnQuery_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

        //Iterating the array
        foreach (string s in sxc)
        {
            txt_ProgressDetails.Visible = true;
            AppendTextBoxLine("Getting Data For " + s);

            //Put data into DataTable
            PopulateDT(s);
        }

        //If the cancel button was pressed
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
}

delegate void UpdateUICallback(string statusMessage);
private void AppendTextBoxLine(string statusMessage)
{
    if (InvokeRequired)
    {
        UpdateUICallback d = new UpdateUICallback(AppendTextBoxLine);
        this.Invoke(d, new object[] {statusMessage});
    }
    else
    {
        if (txt_ProgressDetails.Text.Length > 0)
                txt_ProgressDetails.AppendText(Environment.NewLine);
        txt_ProgressDetails.AppendText(statusMessage);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM