2010-06-10 2 views
0

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

Я использую библиотеку, чтобы открыть форму, когда есть обновленный файл и загрузить с помощью edtFTPNet

В форме я передать объект FTP и начать загрузку, в FormLoad я обрабатывать два события, и я использую тему StartDownload(). Мои два события никогда не вызывают, я использую их, чтобы установить индикатор выполнения.

public partial class UpdateProgressForm : XtraForm 
{ 
    public FTPConnection FtpConn { get; set; } 
    public string UpdateFileName { get; set; } 

    public UpdateProgressForm() 
    { 
     InitializeComponent(); 
    } 

    private void OnLoad(object sender, EventArgs e) 
    { 
     FtpConn.Downloading += FileDownLoading; 
     FtpConn.BytesTransferred += FileBytesTransfered; 
    } 

    private void FileDownLoading(object sender, FTPFileTransferEventArgs e) 
    { 
     progressBar.Properties.Maximum = (int) e.FileSize; 
    } 

    private void FileBytesTransfered(object sender, BytesTransferredEventArgs e) 
    { 
     progressBar.Position = (int) e.ByteCount; 
    } 

    public void StartDownload() 
    { 
     FtpConn.DownloadFile(@".\" + UpdateFileName, UpdateFileName); 
    } 

    private void OnShown(object sender, EventArgs e) 
    { 
     Thread tt = new Thread(StartDownload) {IsBackground = true}; 
     tt.Start(); 
    } 
} 

метод Библиотека вызова формы:

private void DownloadUpdateFile(string updateFileName) 
{ 
    using (ProgressForm = new UpdateProgressForm { FtpConn = FtpConn, UpdateFileName = updateFileName }) 
    { 
     ProgressForm.ShowDialog(); 
    } 
} 

Любая помощь? Спасибо.

ответ

0

Вы уверены, что обработчики событий не вызываются? Я думаю, ваша проблема скорее в том, что вы пытаетесь обновить индикатор выполнения рабочего потока, на который вызывается обработчики событий (который не является потоком, на котором был создан графический интерфейс). Вы должны убедиться, что GUI обновления выполняются на правильной резьбе:

private void FileDownLoading(object sender, FTPFileTransferEventArgs e) 
{ 
    progressBar.Invoke((MethodInvoker) delegate 
    { 
     progressBar.Properties.Maximum = (int) e.FileSize; 
    }); 
} 
+0

Я изменил код, как вы показываете, но ничего не происходит снова. В библиотеке, которая является вызывающей формой, вскоре, когда я закрою форму, обработчик IsDownloaded, который обрабатывается в библиотеке, вызывается правильно. Внутри формы есть проблема. I Редактировать с помощью образца кода библиотеки. И я получаю исключение из TargetInvocation –

+0

@gtas: пожалуйста, обновите вопрос с подробностями исключения TargetInvocationException. –

+0

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

0
  1. Взгляни в конструкторе и убедитесь, что вы подписаться на эти события
  2. Убедитесь созданием экземпляра и показать это от Главная тема.
+0

Я подписываюсь на события в событии Load form, как вы видите. И я уверен, что я создаю экземпляр и покажу форму в основном потоке, есть только этот вызов метода, который я использую в отдельном потоке, потому что другой мудрый пользовательский интерфейс зависает до его завершения (SYNC Transfer, как я мог бы его назвать). –

+0

Я имел ввиду события OnLoad и OnShown. –

+0

Кажется, что подписка происходит до начала потока. OnLoad перед OnShown –

Смежные вопросы