2012-09-03 45 views
0

我在多線程應用程序(DownloadFileCompletedDownloadProgressChanged)中使用WebClient事件時出現問題。 我有我創建一個計時器的主要方法。每隔一段時間,如果滿足條件,我將創建一個線程來彈出另一個窗體(DownloaderForm)。DownloadFIleCompleted和DownloadProgressChanged未在多線程中贏得表單應用程序

void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    var thread = new Thread(SilentCheckingUpdate) 
        { 
         Name = "Update Checker", 
        }; 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
} 

用於更新的方法SilentChekingUpdate檢查。

如果找到,它會從win窗體類Updater中調用另一種方法,該方法將StartDownload從Downloader中調用。

public void ShowUpdateUI(Item currentItem) 
    { 

     var downloader = new Downloader(); 
     downloader.StartDownload(); 
    } 

下載器包含WebBrowserControl。我做了一個調用DownloadFileAsync的方法。

public void StartDownload() 
     { 

      // start async download 
      var client = new WebClient(); 

      client.DownloadProgressChanged += ClientDownloadProgressChanged; 
      client.DownloadFileCompleted += ClientDownloadFileCompleted; 
      var url = new Uri(_item.DownloadLink); 

      client.DownloadFileAsync(url, _tempName); 
     } 

如果我從表單線程調用StartDownload函數,一切正常,事件被觸發。當我使用TimerElapsed的StartDownload工作線程時,DownloadFileAsync的事件不再被觸發。

你能幫我嗎?

謝謝!

+0

這是很難說什麼可能是錯誤的,當你不提供代碼,顯示問題。你說你從TimerElapsed的工作線程中遇到了StartDownload的問題,但是你沒有提供從TimerElapsed中創建的線程調用StartDownload的代碼 –

+0

我編輯了這篇文章的更多信息謝謝你的時間,Peter! –

回答

1

目前還不清楚爲什麼你開始一個線程,基本上只是調用DownloadFileAsync - 下載文件異步。如果DownloadFileAsync是異步的,那麼啓動另一個線程來調用它就沒有多少理由。

我認爲我會考慮的是您在StartDownload方法中創建本地client對象。這幾乎立即讓client超出範圍,並可能讓GC收集它。如果發生這種情況,可能會導致問題。 也許製作client成員字段可能有幫助;但是,這是一個猜測。

您還沒有提供,工程*代碼」,所以真的很難說,爲什麼有區別。

+0

我開始了一個線程,因爲我從WebBrowser控件中得到了一個像下面這樣的結果:「ActiveX控件'8856f961-340a-11d0-a96b-00c04fd705a2'不能實例化,因爲當前線程不在單線程單元中。」 –

+0

您的主線程*必須*是STA我如果您想在表單上使用ActiveX控件。當你創建一個Windows窗體應用程序時,主線程默認是STA(STAThread on Program.Main)。如果你改變了這一點,那就是爲什麼你會得到這個錯誤。如果你還沒有改變,那麼你已經創建了另一個調用WebBrowser的線程。 –

+0

WebBrowser只能在STA線程上使用,並且只能在具有消息泵的線程上使用。即UI線程。 –