Если у меня есть метод, который возвращает строку следующим образом:
public string ExecuteCommandSync(object command)
{
string result = "";
try
{
System.Diagnostics.ProcessStartInfo procStartInfo =
new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
result = proc.StandardOutput.ReadToEnd();
Console.WriteLine(result);
}
catch (Exception objException)
{
MessageBox.Show("error : " + objException.Message);
}
return result;
}
Теперь это работает нормально для небольших данных, но если у меня большие данные, они зависают ..
Если я добавлю это в поток, это ускорит его работу с большими данными или, по крайней мере, улучшит его, так как я совершенно новичок в потоке и не знаю, как вернуть результат в виде строки снова с потоком ...
Может кто-нибудь помочь, пожалуйста.
спасибо
РЕДАКТИРОВАТЬ:
Это приложение c winform c #, работающее в Windows 7.
По сути, идея состоит в том, чтобы вызвать команду cmd и запустить команду ...
Это ошибка, которую я получаю при запуске из visual studio:
The CLR has been unable to transition from COM context 0x8d85c0 to COM context 0x8d8730 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.
РЕДАКТИРОВАТЬ 2 ::
Хорошо, вот что я сделал до сих пор
public string ExecuteCommandSync(object command)
{
string result = "";
try
{
backgroundWorker1.RunWorkerAsync(command);
}
catch (Exception objException)
{
MessageBox.Show("error : " + objException.Message);
}
return result;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string result;
Thread.Sleep(300);
object command = (object)e.Argument;
System.Diagnostics.ProcessStartInfo procStartInfo =
new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
result = proc.StandardOutput.ReadToEnd();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
results = (string)e.Result;
}
и затем я вызываю его, используя:
string result1 = ExecuteCommandSync(command);