27 / 27 / 7
Регистрация: 15.06.2014
Сообщений: 165
1

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна

04.08.2014, 11:57. Показов 5023. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Написал класс для загрузки файлов, подключил его к главной форме, нажимаю загрузить, а выдает исключение "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна". Вот код класса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
internal class FileDownloader
    {
        private Thread thrDownload;
        private Stream strResponse;
        private Stream strLocal;
        private HttpWebRequest webRequest;
        private HttpWebResponse webResponse;
        private static int PercentProgress;
        private delegate void UpdateProgessCallback(Int64 BytesRead, Int64 TotalBytes);
        private ArrayList files = new ArrayList();
        private MainForm mainForm = new MainForm();
 
       public FileDownloader()
       {
           files.Add("http://www.mysite.com/file.exe!C:/File.exe");
           files.Add("http://www.mysite.com/file1.exe!C:/File1.exe");
       }
 
        public void UpdateProgress(Int64 BytesRead, Int64 TotalBytes)
        {
            // Calculate the download progress in percentages
            PercentProgress = Convert.ToInt32((BytesRead * 100) / TotalBytes);
            // Make progress on the progress bar
            mainForm.TaskProgress.Value1 = PercentProgress;
            // Display the current progress on the form
            mainForm.StatusLabel.Text = @"Downloaded " + BytesRead + @" out of " + TotalBytes + @" (" + PercentProgress + @"%)";
        }
 
        public void Download(object startPoint)
        {
            foreach (object t in files)
            {
                string[] file = t.ToString().Split('!');
                try
                {
                    int startPointInt = Convert.ToInt32(startPoint);
                    webRequest = (HttpWebRequest) WebRequest.Create(file[0]);
                    webRequest.Proxy = new WebProxy();
                    webRequest.AddRange(startPointInt);
 
                    webRequest.Credentials = CredentialCache.DefaultCredentials;
                    webResponse = (HttpWebResponse) webRequest.GetResponse();
                    Int64 fileSize = webResponse.ContentLength;
                    strResponse = webResponse.GetResponseStream();
 
 
                    strLocal = startPointInt == 0
                        ? new FileStream(file[1], FileMode.Create, FileAccess.Write, FileShare.None)
                        : new FileStream(file[1], FileMode.Append, FileAccess.Write, FileShare.None);
 
                    // It will store the current number of bytes we retrieved from the server
                    int bytesSize;
                    // A buffer for storing and writing the data retrieved from the server
                    byte[] downBuffer = new byte[2048];
 
                    
                    while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                    {
                       
                        strLocal.Write(downBuffer, 0, bytesSize);
                                 
                            mainForm.Invoke(new UpdateProgessCallback(this.UpdateProgress), // здесь выбивает исключение
                                new object[] {strLocal.Length, fileSize + startPointInt});
                        
                    }
                }
                finally
                {
                    strResponse.Close();
                    strLocal.Close();
                }
            }
        }
    }
Исключение выбивает на строчке:
C#
1
2
mainForm.Invoke(new UpdateProgessCallback(this.UpdateProgress), // здесь выбивает исключение
                                new object[] {strLocal.Length, fileSize + startPointInt});
Из главной формы вызываю метод так:
C#
1
2
3
            FileDownloader fileDownloader = new FileDownloader();
           Thread  thrDownload = new Thread(new ParameterizedThreadStart(fileDownloader.Download));
            thrDownload.Start(0);
Помогите.
P.S TaskProgress (progressbar) и statusLabel - элементы Telerik UI Controls
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2014, 11:57
Ответы с готовыми решениями:

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.
Помогите исправить ошибку Invoke(new MethodInvoker(InvokedConnectionStateChange)); // Ошибка:...

Invoke - невозможно вызвать до завершения создания дескриптора окна
В прикрепленном проекте из клиента пытаюсь обратиться к серверу через библиотеку - возникает...

Потоки. Нельзя вызвать Invoke до создания дескриптора окна
MainPanel SP = new MainPanel(); //окно с чартом OneCharting chartI =new OneCharting(); ...

Невозможно вызвать Invoke до завершения создания дескриптора окна
При нажатии на кнопку загружается список из ms sql и отображается в grid. Загрузка и отображение...

7
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
04.08.2014, 12:34 2
Frederick, а что такое есть
C#
1
private MainForm mainForm = new MainForm();
Это типа основная форма?
0
27 / 27 / 7
Регистрация: 15.06.2014
Сообщений: 165
04.08.2014, 13:26  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
а что такое есть
Да, ссылка на основную форму чтобы управлять progressbar'ом и statusLabel'ом

Добавлено через 32 минуты
UPDATE
0
1143 / 872 / 505
Регистрация: 09.04.2014
Сообщений: 2,054
04.08.2014, 14:47 4
Цитата Сообщение от Frederick Посмотреть сообщение
Да, ссылка на основную форму чтобы управлять progressbar'ом и statusLabel'ом
Это ссылка на новую форму, которую вы создаете вместе с FileDownloader
0
27 / 27 / 7
Регистрация: 15.06.2014
Сообщений: 165
04.08.2014, 14:48  [ТС] 5
Так в чем ошибка?
0
1143 / 872 / 505
Регистрация: 09.04.2014
Сообщений: 2,054
04.08.2014, 15:29 6
Лучший ответ Сообщение было отмечено Frederick как решение

Решение

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

C#
1
2
3
4
5
6
7
8
9
 
private MainForm mainForm; 
 
       public FileDownloader(MainForm form)
       {
           mainForm = form;
           files.Add("http://www.mysite.com/file.exe!C:/File.exe");
           files.Add("http://www.mysite.com/file1.exe!C:/File1.exe");
       }
Из главной формы:
C#
1
 FileDownloader fileDownloader = new FileDownloader(this);
1
43 / 43 / 19
Регистрация: 30.11.2011
Сообщений: 112
04.08.2014, 15:31 7
Посмотрите на ситуацию:
у вас где-то на форме MainForm создаётся экземпляр класса FileDownloader, и тут создаётсяновая форма, которая к вышеупомянутой никакого отношения не имеет;
Цитата Сообщение от Frederick Посмотреть сообщение
C#
1
private MainForm mainForm = new MainForm();
Предлагаю вместо этой строчки написать так
Цитата Сообщение от Frederick Посмотреть сообщение
C#
1
private MainForm mainForm;
и передавать в конструкторе как-то так:
Цитата Сообщение от Frederick Посмотреть сообщение
C#
1
2
3
4
5
6
public FileDownloader(MainForm mainForm)
* * * *{
           this.mainForm = mainForm;
* * * * * *files.Add("http://www.mysite.com/file.exe!C:/File.exe");
* * * * * *files.Add("http://www.mysite.com/file1.exe!C:/File1.exe");
* * * *}
Цитата Сообщение от Frederick Посмотреть сообщение
C#
1
FileDownloader fileDownloader = new FileDownloader(this);
1
27 / 27 / 7
Регистрация: 15.06.2014
Сообщений: 165
04.08.2014, 15:41  [ТС] 8
nedel, Огромное спасибо, все работает.
0
04.08.2014, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2014, 15:41
Помогаю со студенческими работами здесь

Невозможно вызвать Invoke ... до завершения создания дескриптора окна
Прошу помощи. Собрал вот такой код. Но при запуске ошибка "невозможно вызвать invoke или...

Ошибка: Невозможно вызвать Invoke или BeginInvoke
Порой мне кажется, что я слишком часто к вам обращаюсь, но прошу о помощи. Ситуация такова,...

Ошибка "Невозможно вызвать Invoke или BeginInvoke." при закрытии формы
Всем привет! Когда закрываю приложение если строка 78 закомментирована, то в строке 80 появляется...

Ошибка "Невозможно получить дескриптор окна для элемента управления 'WebBrowser'"
Прога должна каждые 20 сек синхронизироваться с сайтом с помощью таймера: System.Timers.Timer...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru