Windows форма не отвечает: Как я могу решить эту проблему? - PullRequest
0 голосов
/ 30 января 2020

Я создаю службу windows и проект установки.

Во время установки службы windows я добавляю форму windows, которая позволяет пользователю загружать файл в папку проекта. но когда я нажимаю на кнопку, чтобы загрузить файл, моя форма windows всегда находится в состоянии не отвечает

not responding

ProjectInstaller моей windows службы

public override void Install(IDictionary stateSaver)
{
    base.Install(stateSaver);

    Form1 validationForm = new Form1();
    validationForm.ShowDialog();
}

Windows форма

public Form1()
{
    InitializeComponent();
}

private void button1_Click_1(object sender, EventArgs e)
{
    try
    {
        OpenFileDialog fileDialog = new OpenFileDialog();
        //fileDialog.Filter = "Dat files |*.dat";
        fileDialog.Multiselect = false;

        if (fileDialog.ShowDialog() == DialogResult.OK)
        {
            var path = fileDialog.FileName;
            Process.Start(path);
        }
    }
    catch (Exception)
    {
        MessageBox.Show("An error occured", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Ответы [ 3 ]

4 голосов
/ 30 января 2020

Я думаю Process.Start(path); блок пользовательского интерфейса потока. Попробуйте использовать Task.Run(() => Process.Start(a)); вместо.

1 голос
/ 30 января 2020

Ваш пользовательский интерфейс заблокирован из-за длительного процесса, поэтому вы видите "Не отвечает"

Отметьте свой клик Async:

private async void button1_Click_1(object sender, EventArgs e)

и

 await Task.Run(() =>
 {
    //Insert the long running stuff here
    Process.Start(path);            
 });
0 голосов
/ 30 января 2020

Попробуйте это.

private void button1_Click(object sender, EventArgs e)
{
    var task = new Thread(() => GetFile());
    task.SetApartmentState(ApartmentState.STA);
    task.Start();
    task.Join();
}

private static void GetFile()
{
    try
    {
        OpenFileDialog fileDialog = new OpenFileDialog();
        //fileDialog.Filter = "Dat files |*.dat";
        fileDialog.Multiselect = false;

        if (fileDialog.ShowDialog() == DialogResult.OK)
        {
            var path = fileDialog.FileName;
            Process.Start(path);
        }
    }
    catch (Exception)
    {
        MessageBox.Show("An error occured", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
...