Почему поток останавливается при запуске нового процесса, когда приложение (c #) все еще работает? - PullRequest
0 голосов
/ 30 декабря 2011

Есть ли какие-либо проблемы, которые я должен делать осторожно при запуске нового процесса в многопоточном приложении?

Я пробовал это в простом проекте:

static void Main(string[] args)
{
    Process.Start(@"D:\System\Desktop\a.txt");
    MessageBox.Show("Success");
}

И он работает отлично.Но когда я делаю это в моем большом проекте, который использует несколько потоков, его поток перестает работать («a.txt» открывается, но «Success» не отображается), в то время как мое приложение (другой поток) работает хорошо.

В чем проблема в этой ситуации?

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

Это не ответ - Я не могу поместить весь этот код в комментарий ...

Это работает для меня.Скажите, чем ваш код отличается от этого:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;

namespace Test
{
    class Program
    {
        const string OutputFile = @"E:\Output.txt";

        object _lock = new object();

        static void Main(string[] args)
        {
            Program program = new Program();

            Thread thread = new Thread(program.ThreadMethod);
            thread.Start(@"E:\Test.txt");

            thread = new Thread(program.ThreadMethod);
            thread.Start(@"E:\DoesntExist.txt");

            Console.ReadKey();
        }

        void ThreadMethod(object filename)
        {
            String result = RunNormal(filename as string);
            lock (_lock)
            {
                FileInfo fi = new FileInfo(OutputFile);
                if (!fi.Exists)
                {
                    try
                    {
                        fi.Create().Close();
                    }
                    catch (System.Security.SecurityException secEx)
                    {
                        Console.WriteLine("An exception has occured: {0}", secEx.Message);
                        return;
                    }
                }

                StreamWriter sw = fi.AppendText();
                sw.WriteLine(result);
                sw.Close();
            }
        }

        string RunNormal(string fullfilename)
        {
            try
            {
                Process.Start(fullfilename);
                return fullfilename + "|Success";
            }
            catch (Exception e)
            {
                return fullfilename + "|" + e.ToString();
            }
        }
    }
}

Выходные данные в Output.txt:

E:\DoesntExist.txt|System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)
   at Test.Program.RunNormal(String fullfilename) in E:\Projekti\VS2010\Test\Test\Program.cs:line 59
E:\Test.txt|Success

Насколько отличается ваш код?Вы называете какие-то другие методы?Как вы обрабатываете результаты?

2 голосов
/ 30 декабря 2011

Если у вас есть приложение Windows.Forms и вы пытаетесь показать окно сообщения из потока, который не является основным потоком пользовательского интерфейса, поведение окна сообщения не определено. Смысл, это может или не может показать, быть непоследовательным, или некоторые другие проблемы.

Например, отображение окна сообщения из события BackgroundWorker's DoWork может или не может работать. В одном случае сообщение-окно-результат всегда отменялось независимо от того, какая кнопка была нажата.

Поэтому, если вы используете окно сообщения только для целей отладки, используйте другую технику. Если вам нужно показать окно сообщения, вызовите его из основного потока пользовательского интерфейса.

Консольное приложение обычно не должно иметь проблем с отображением окон сообщений. Тем не менее, у меня были случаи, когда мне приходилось спать в потоке за 100 мс до вызова окна сообщения.

Обратите внимание, как указал TomTom, основным потоком пользовательского интерфейса является цикл сообщений Windows в приложении. Это напоминает мне, что мне когда-то приходилось создавать форму в консольном приложении, чтобы создать цикл сообщений Windows, чтобы мое приложение могло отвечать на сообщения Windows.

0 голосов
/ 30 декабря 2011

Убедитесь, что Process.Start работает. В некоторых случаях передача имени файла недостаточно хороша. В вашем примере кода вы должны будете установить свойство use-shell; в противном случае вам придется использовать cmd start <filename> или эквивалентный.

Поэтому просто запустите NotePad.exe, чтобы убедиться, что Process.Start работает. Если это так, то ваша проблема - это команда процесса и командная строка.

...