在构造函数中使用Thread?

时间:2015-06-10 11:53:30

标签: c# multithreading constructor

我是新手并且正在努力学习正确的方法。

在构造函数中使用Thread来避免gui(Form)在创建对象时冻结是否可以接受?我经常会重复使用这门课程。

class Cmd
{
    protected static string parameters;
    protected HashSet<string> list_result;

    public Cmd( string parameters)
    {
        Thread Thread1 = new Thread(new ThreadStart(Process1));
        Thread1.Start();
        Thread1.Join();
    }

     private void Process1()
    {
        ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd", "/c " + parameters);
        processStartInfo.RedirectStandardOutput = true;
        processStartInfo.RedirectStandardError = true;
        processStartInfo.CreateNoWindow = true;
        processStartInfo.UseShellExecute = false;

        Process process = Process.Start(processStartInfo);

        list_result = new HashSet<string>();
        while (!process.StandardOutput.EndOfStream)
        {
            string line = process.StandardOutput.ReadLine();
            list_result.Add(line);
        }
    }

2 个答案:

答案 0 :(得分:3)

你甚至不需要一个线程。您可以使用StreamReader的asynchronous methods异步读取输入行:

    private async void button1_Click(object sender, EventArgs e)
    {
        var lines=await Process1(@"dir g:\ /s");
        var result= String.Join("|", lines);
        this.textBox1.Text = result;
    }

    private async Task<HashSet<String>>   Process1(string parameters)
    {
        var list_result = new HashSet<string>();
        ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd", "/c " + parameters);
        processStartInfo.RedirectStandardOutput = true;
        processStartInfo.RedirectStandardError = true;
        processStartInfo.CreateNoWindow = true;
        processStartInfo.UseShellExecute = false;

        Process process = Process.Start(processStartInfo);


        while (!process.StandardOutput.EndOfStream)
        {
            string line = await process.StandardOutput.ReadLineAsync();
            list_result.Add(line);
        }
        return list_result;
    }

优点是你不浪费一个线程,你不需要任何同步代码或静态字段来传递参数和读取结果。

答案 1 :(得分:0)

如果您想在执行耗时任务时避免冻结UI,则应将BackgroundWorker添加到表单并在其事件处理程序中运行任务

您可以在此处找到示例:https://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

你应该考虑使用更新的异步/等待逻辑,这通常比BackgroundWorker好,正如Panagiotis Kanavos在他的回答中提到的那样