Файл не загружается windows форма C# - PullRequest
1 голос
/ 31 января 2020

Я создаю windows сервис и проект установки. Я создаю windows форму для загрузки файла для моего проекта установки.

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

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

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

    Form1 validationForm = new Form1(Context.Parameters["TARGETDIR"]);
    validationForm.ShowDialog();
}

Windows форма

private static string folderToUploadFile = string.Empty;
public Form1(string folder)
{
    InitializeComponent();
    folderToUploadFile = folder;
    label1.Text = folder;
}

private void button1_Click_1(object sender, EventArgs e)
{
    var task = new Thread(() => {

        try
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Filter = "Dat files |*.dat";
            fileDialog.Multiselect = false;

            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                var filename = fileDialog.FileName;
                Task.Run(() =>
                {
                    File.Copy(filename, folderToUploadFile);
                    this.Close();
                });

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }


    });
    task.SetApartmentState(ApartmentState.STA);
    task.Start();
    task.Join();
}

1 Ответ

0 голосов
/ 31 января 2020

Это работает для меня, я сделал следующие изменения:

  1. Использовать Task.Factory.StartNew вместо Task.Run
  2. Добавлены некоторые логи c для объединения paths.

Ваше нажатие кнопки должно выглядеть примерно так.

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

    if (fileDialog.ShowDialog() == DialogResult.OK)
    {
        var fullPath = fileDialog.FileName;
        var fileName = Path.GetFileName(fullPath);

        var destination = Path.Combine(folderToUploadFile, fileName);

        Task.Factory.StartNew(() =>
        {
            File.Copy(fullPath, destination);
            this.Close();
        });

    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Обратите внимание, что при копировании файлов вручную в каталог установки они будут оставаться после удаления, поэтому может wi sh, чтобы справиться с этим.

РЕДАКТИРОВАТЬ:

На самом деле вам не нужен Task.Factory.StartNew () .... Task.Run должен работать так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...