System.Threading.ThreadStateException OpenFileDialog - PullRequest
1 голос
/ 26 октября 2019

Сегодня я пытался сделать клиент adb в C # с приличным графическим интерфейсом. Итак, я провел небольшое исследование и обнаружил, что SharpAdbClient.

Чтобы сделать push-файл, я использую var file = openFileDialog2.ShowDialog();, чтобы выбрать файл. Но если я пытаюсь отправить большой файл, графический интерфейс перестает отвечать (как это должно быть).

Итак, чтобы решить эту проблему, я создал поток, который выполняет push, но у меня естьThreadStateException, когда я пытаюсь запустить OpenFileDialog.

Вот пример кода:

private void button4_Click(object sender, EventArgs e)
{
    Thread pushFile = new Thread(push);
    pushFile.Start();
}

private void push()
{
    var device = AdbClient.Instance.GetDevices().First();
    var file = openFileDialog2.ShowDialog();
    var p = new Progress<int>(Progress_Bar);

    String newPath = textBox2.Text;
    if (file == DialogResult.OK)
    {
        String filePath = openFileDialog2.InitialDirectory + openFileDialog2.FileName;
        using (SyncService service = new SyncService(new AdbSocket(new IPEndPoint(IPAddress.Loopback, AdbClient.AdbServerPort)), device))
        using (Stream stream = File.OpenRead(filePath))
        {
            service.Push(stream, newPath, 444, DateTime.Now, p, CancellationToken.None);
        }
    }
}

1 Ответ

2 голосов
/ 26 октября 2019

Вы не можете вызывать UI-методы для потоков, которые не являются потоком GUI. Вы должны будете отправить это в правильную ветку. В WinForms вы будете использовать Invoke, BeginInvoke и аналогичные для этого.

Посмотрите документацию Control.Invoke для получения дополнительной информации по этому вопросу.

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