2016-05-30 13 views
2

UserControlのBackgroundWorkerを実行して、サーバーからコンテンツをダウンロードする際に問題があります。私の問題は、私が次のコードを書くとき、UserControl getがメインフォームに戻り、ダウンロードが開始されないということです。WPFのUserControlでBackgroundWorkerを実行するには?

public AdFeeds() 
     { 
       InitializeComponent(); 
       bgWorker = new BackgroundWorker(); 
       bgWorker.DoWork += bgWorker_DoWork; 
       bgWorker.RunWorkerAsync(); 
     } 
void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      DownloadWallpaper(); 
     } 

壁紙をダウンロードするために私は

public static void DownloadWallpaper() 
     { 
      try 
      { 

       DataSet dsFile = Global.ReadConfig; 
       XDocument xDoc = XDocument.Load(dsFile.Tables[0].Rows[0][9].ToString());//[email protected]"..\..\..\App_Data\Wallpaper.xml");//(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Wallpaper\\Themes.xml"); 
       string s = xDoc.Root.Name.ToString(); 
       var countNode = xDoc.Root.Elements().Count(); 

       for (int i = 0; i < countNode; i++) 
       { 
        XNode childNode = xDoc.Root.Nodes().ElementAt(i); 
        XElement ele = (XElement)childNode; 
        path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Wallpaper\\Banner\\" + ele.Name; 



        DirectoryInfo di = Directory.CreateDirectory(path); 
        var movieList = from a in xDoc.Root.Descendants(ele.Name).Elements() 
            select new Ad() 
            { 
             Path = ele.Name.ToString(), 
             Link = a.Value 
            }; 
        foreach (var a in movieList) 
        { 
         Global.filedownload(dsFile.Tables[0].Rows[0][1].ToString() + "/Banner/" + ele.Name + "/", path + "\\"); 
         advertisement.Add(a); 
        } 
       } 
      } 
      catch 
      { 

      } 
     } 

は、私は、メインフォームは私がダウンロードしたユーザーコントロールの内容私のUIまで待つように初期化されるときに、ユーザーコントロールが初期化されることを望む次のコードを使用していますコンテンツがダウンロードされるまでロックされています。

答えて

2

AdFeedsがロードされた後でイベントを実行します。これを行うには、Loadedイベントハンドラでワーカーを開始します。

public AdFeeds() 
{ 
    InitializeComponent(); 

    Loaded += OnLoaded; 
} 

private async void OnLoaded(object sender, RoutedEventArgs e) 
{ 
    Loaded -= OnLoaded; 

    await Task.Run(()=> 
    { 
     DownloadWallpaper(); 
    }); 
} 

また、バックグラウンドワーカーを使用する必要はありません。単純なTaskawaitを使うことができます。

+0

それは私のために働いたが、それでも私はこれに問題があります。私は、壁紙のフォルダがダウンロードされるたびにUIを更新したいが、このコードでは、壁紙のフォルダ全体がダウンロードされたときにUIが更新されている。 –

+1

私はあなたがあなたの答えを持っているので新しい質問を投稿するべきだと思います。 – Prathyush

関連する問題