2016-05-30 44 views
2

我在运行UserControl中的BackgroundWorker以从服务器下载某些内容时遇到了问题。我的问题是,当我编写下面的代码时,UserControl获取返回到主窗体并下载不开始。如何在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

它为我工作,但我仍然有这个问题。我想更新用户界面,每当下载墙纸文件夹,但与此代码我的用户界面正在更新时,保存在服务器上的壁纸的整个文件夹被下载。 –

+1

我想你应该发布新的问题,因为你有你的答案。 – Prathyush