C# 在构造函数中使用线程?

C# 在构造函数中使用线程?,c#,multithreading,constructor,C#,Multithreading,Constructor,我是一个新手,努力用正确的方法学习 在构造函数中使用线程以避免gui(窗体)在创建对象时冻结是否可以接受?我会经常重用这个类 class Cmd { protected static string parameters; protected HashSet<string> list_result; public Cmd( string parameters) { Thread Thread1 = new Thread(new Thre

我是一个新手,努力用正确的方法学习

在构造函数中使用线程以避免gui(窗体)在创建对象时冻结是否可以接受?我会经常重用这个类

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);
        }
    }
class命令
{
受保护的静态字符串参数;
受保护的哈希集列表\u结果;
public Cmd(字符串参数)
{
线程Thread1=新线程(新线程开始(进程1));
Thread1.Start();
Thread1.Join();
}
私有无效进程1()
{
ProcessStartInfo ProcessStartInfo=新的ProcessStartInfo(“cmd”、“/c”+参数);
processStartInfo.RedirectStandardOutput=true;
processStartInfo.RedirectStandardError=true;
processStartInfo.CreateNoWindow=true;
processStartInfo.UseShellExecute=false;
Process Process=Process.Start(processStartInfo);
list_result=new HashSet();
而(!process.StandardOutput.EndOfStream)
{
string line=process.StandardOutput.ReadLine();
列出结果。添加(行);
}
}

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

您可以在这里找到示例:


你也应该考虑使用新的异步/Acess逻辑,它通常比后台工作人员好,正如Panagiotis Kanavos在他的回答

>P>中提到的:如果你想避免在执行耗时任务时冻结UI,你应该在其事件处理程序

中添加<代码>后台工作人员< /代码>,并运行你的任务。 您可以在这里找到示例:


你也应该考虑使用新的异步/Acess逻辑,它通常比后台工作人员好,正如Panagiotis Kanavos在他的回答

>P>中提到的:如果你想避免在执行耗时任务时冻结UI,你应该在其事件处理程序

中添加<代码>后台工作人员< /代码>,并运行你的任务。 您可以在这里找到示例:


你也应该考虑使用新的异步/Acess逻辑,它通常比后台工作人员好,正如Panagiotis Kanavos在他的回答

>P>中提到的:如果你想避免在执行耗时任务时冻结UI,你应该在其事件处理程序

中添加<代码>后台工作人员< /代码>,并运行你的任务。 您可以在这里找到示例:


你也应该考虑使用比AbdieWorkWork更好的Asic/Acess逻辑,正如Panagiotis Kanavos在他的回答

中提到的,你甚至不需要一个线程。你可以使用StreamReader来异步读取输入行:

    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;
    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
变量行=等待进程1(@“dir g:\/s”);
var result=String.Join(“|”,行);
this.textBox1.Text=结果;
}
专用异步任务进程1(字符串参数)
{
var list_result=new HashSet();
ProcessStartInfo ProcessStartInfo=新的ProcessStartInfo(“cmd”、“/c”+参数);
processStartInfo.RedirectStandardOutput=true;
processStartInfo.RedirectStandardError=true;
processStartInfo.CreateNoWindow=true;
processStartInfo.UseShellExecute=false;
Process Process=Process.Start(processStartInfo);
而(!process.StandardOutput.EndOfStream)
{
string line=wait process.StandardOutput.ReadLineAsync();
列出结果。添加(行);
}
返回结果列表;
}

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

您甚至不需要线程。您可以使用StreamReader异步读取输入行:

    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;
    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
变量行=等待进程1(@“dir g:\/s”);
var result=String.Join(“|”,行);
this.textBox1.Text=结果;
}
专用异步任务进程1(字符串参数)
{
var list_result=new HashSet();
ProcessStartInfo ProcessStartInfo=新的ProcessStartInfo(“cmd”、“/c”+参数);
processStartInfo.RedirectStandardOutput=true;
processStartInfo.RedirectStandardError=true;
processStartInfo.CreateNoWindow=true;
processStartInfo.UseShellExecute=false;
Process Process=Process.Start(processStartInfo);
而(!process.StandardOutput.EndOfStream)
{
string line=wait process.StandardOutput.ReadLineAsync();
列出结果。添加(行);
}
返回结果列表;
}

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

您甚至不需要线程。您可以使用StreamReader异步读取输入行:

    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;
    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
变量行=等待进程1(@“dir g:\/s”);
var result=String.Join(“|”,行);
this.textBox1.Text=结果;
}
专用异步任务进程1(字符串参数)
{
var list_result=new HashSet();
ProcessStartInfo ProcessStartInfo=新的ProcessStartInfo(“cmd”、“/c”+参数);
processStartInfo.RedirectStandardOutput=true;
processStartInfo.RedirectStandardError=true;
processStartInfo.CreateNoWindow=true;
processStartInfo.UseShellExecute=false;
Process Process=Process.Start(processStartInfo);
而(!process.StandardOutput.EndOfStream)
{
string line=wait process.StandardOutput.ReadLineAsync();
列出结果。添加(行);
}
返回结果列表;
}
优点是你可以