【发布时间】:2015-06-10 11:53:29
【问题描述】:
我是新手,正在努力学习正确的方法。
是否可以在构造函数中使用线程来避免 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);
}
}
【问题讨论】:
-
您在此处编写代码的方式将无济于事,因为您加入了线程,在线程完成之前有效地阻塞。这真的解决了什么问题吗?
-
我不会加入线程 - 不会加入构造函数。你至少不能使用
continuation吗?您需要使用task而不是System.Thread,但是对于您要执行的操作,这应该没问题,恕我直言... -
考虑使用
Task.Run来运行您的方法,而不是单独的类。您可以在 UI 中调用await以异步等待其他进程完成。 -
或者你可以使用
ReadLineAsync而不是ReadLine,并且在不使用线程的情况下避免阻塞 -
它工作正常,我只想知道这种做法是否可以接受。 join() 是必需的,因为必须在调用任何方法之前创建对象。作为建议,我会尝试 Task,因为它看起来很容易实现。
标签: c# multithreading constructor