方法的后台工作人员报告字符串 [英] Background worker report string from a method

查看:91
本文介绍了方法的后台工作人员报告字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个复制文件方法,我想将其包裹在后台工作人员周围.我希望复制文件方法将字符串报告给当前文件名所在的UI线程(更改标签).我似乎无法使其正常工作,并且出现了跨线程ui错误.这是我的代码.

I've created a copy file method that i would like to wrap around a background worker. I would like the copy file method to report a string back to the UI thread (change a label) on the current file name its on. I can't seem to get it to work and i'm getting cross thread ui errors. Here is my code.

工作

      //Textbox Array Values
        // 0 = computername
        // 1 = username
        // 2 = password
        string[] tbvalues = (string[])e.Argument;


        string computer = tbvalues[0];
        string user = tbvalues[1];
        string pass = tbvalues[2];

        string userfavorites = @"\\" + computer + @"\C$\Users\" + user + @"\Favorites";

        string hdrivepath = @"\\dist-win-file-3\homes\" + user + @"\Favorites";

        string SourcePath = userfavorites;
        string DestinationPath = hdrivepath;

这部分是用于模拟用户的自定义类

This part is a custom class used to impersonate a user

        using ( new Impersonator( user, "Domain.org", pass ) )
        {
            DirectoryInfo sp = new DirectoryInfo(SourcePath);
            DirectoryInfo dp = new DirectoryInfo(DestinationPath);

            CopyAll(sp, dp, bgwBackup, e);



        }
}

方法

   public void CopyAll(DirectoryInfo source, DirectoryInfo target, BackgroundWorker worker, DoWorkEventArgs e)
    {


        // Check if the target directory exists, if not, create it.
        if (Directory.Exists(target.FullName) == false)
        {
            Directory.CreateDirectory(target.FullName);
        }

        // Copy each file into it’s new directory.
        foreach (FileInfo fi in source.GetFiles())
        {

            //THIS IS THE STRING I WOULD LIKE TO RELAY TO THE BACKGROUND WORKER REPORT PROGRESS
            string currentfile = "Copying " + target.FullName.ToString() + fi.Name.ToString();                

            fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);

            worker.ReportProgress(0, currentfile);


        }

        // Copy each subdirectory using recursion.
        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir =
                target.CreateSubdirectory(diSourceSubDir.Name);
            CopyAll(diSourceSubDir, nextTargetSubDir, bgwBackup, e);
        }
    }

    private void cboBackuppwdshow_CheckedChanged(object sender, EventArgs e)
    {
        if (cboBackuppwdshow.Checked == true)
        {
            txtBackuppwd.UseSystemPasswordChar = false;
        }

        else
        {
            txtBackuppwd.UseSystemPasswordChar = true;
        }
    }

报告进度

 private void bgwBackup_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblBackupStatus.Text = e.UserState.ToString();
    }

按钮事件

 private void btnBackupqueue_Click(object sender, EventArgs e)
    {
        // Kickoff the worker thread to begin it's DoWork function.

        string[] tbvalues = {ddlBackupselectcomp.Text, ddlBackupselectuser.Text, txtBackuppwd.Text};


        backupWorker.RunWorkerAsync(tbvalues);
        lblBackupStatus.Text = "Backup process started please wait... ";
    }

有什么建议吗?谢谢!

Any suggestions ? Thanks!

推荐答案

问题来自以下代码行:

lblBackupStatus.Text = e.UserState.ToString();

这是从另一个线程执行的.您需要使用Invoke方法来更新标签:

This is executed from another thread. You need to use the Invoke method to update your label:

this.InvokeEx(c => this.lblBackupStatus.Text = e.UserState.ToString());

以下是我通常用于控件调用的辅助方法:

Here is the helper methods I usually use for control invoke:

public static class ControlExtensions
{
    public static TResult InvokeEx<TControl, TResult>(this TControl control,
                                                Func<TControl, TResult> func) where TControl : Control
    {
        return control.InvokeRequired
                ? (TResult)control.Invoke(func, control)
                : func(control);
    }

    public static void InvokeEx<TControl>(this TControl control,
                                            Action<TControl> func) where TControl : Control
    {
        control.InvokeEx(c => { func(c); return c; });
    }

    public static void InvokeEx<TControl>(this TControl control, Action action)
        where TControl : Control
    {
        control.InvokeEx(c => action());
    }
}

PS:我已经直接输入了,它可能无法编译(帮助方法除外)

PS: I've typed directly, it may not compile (except the helper methods)

这篇关于方法的后台工作人员报告字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆