一个接一个地调用两个或更多功能

时间:2014-02-26 09:28:45

标签: c# multithreading windows-phone-8

我想要接下来调用两种或更多种方法。当一个函数执行完成后,我需要调用另一个方法。基本上我正在尝试在我的应用程序中实现备份功能。我正在开发 Windows Phone 应用,它可以备份联系人,图片和视频。我为每个人创建了方法。当联系人的备份完成后,我想调用图像方法。我为这些创造了不同的功能。我怎样才能一个接一个地调用这些功能?

我尝试过这样的事情。

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        UploadImagesThread = new Thread(UploadImages);
        UploadContactsThread = new Thread(UploadContacts);
        // Sample code to localize the ApplicationBar
        //BuildLocalizedApplicationBar();
    }

点击上传按钮点击

 if (chkContacts.IsChecked.Value)
 {
     Dispatcher.BeginInvoke(() =>
     {
         SystemTray.ProgressIndicator.Text = "Searching contacts...";
     });
     UploadContactsThread.Start();
 }
 if (chkImages.IsChecked.Value)
 {
     Dispatcher.BeginInvoke(() =>
     {
          SystemTray.ProgressIndicator.Text = "Compressing images...";
     });
     UploadImagesThread.Start();
 }

但它对我没有帮助。我该如何实现?我的 UploadContact 方法有异步方法调用

Contacts objContacts = new Contacts();
objContacts.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(objContacts_SearchCompleted);
objContacts.SearchAsync(string.Empty, FilterKind.None, null);

4 个答案:

答案 0 :(得分:2)

尝试使用任务,这将让您免费为您提供一个线程池。你不能在构造函数中执行此操作,但是你可以覆盖你OnNavigatedTo Mehtod:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {

        base.OnNavigatedTo(e);

        await Task.Run(() => { UploadImages(); });
        await Task.Run(() => { UploadContacts(); });
    }

await将确保在您的图像完成后联系人将开始上传。您还可以查看background uploading,这意味着您的应用无需在操作完成时运行。

答案 1 :(得分:2)

使用Task.ContinueWith()链接来电。

您可以在此处查看:http://msdn.microsoft.com/de-de/library/dd321405(v=vs.110).aspx

应用于您的问题,这应该可以解决问题:

Task.Factory.StartNew(UploadImages).ContinueWith(UploadContacts);

答案 2 :(得分:1)

你对问题的描述(一个接一个地调用一个方法?)不是很清楚,但是看看你的代码,我想你想在开始{{1}之前等待UploadImagesThread线程完成}。

使用任务和async / await关键字,如下所示:

UploadContactsThread

注意:假设您的第二个代码块在UI线程上运行,则不需要使用private async void OnButtonClick(object sender, ...) { if (chkContacts.IsChecked.Value) { SystemTray.ProgressIndicator.Text = "Searching contacts..."; await Task.Run(() => UploadImages()); } if (chkImages.IsChecked.Value) { SystemTray.ProgressIndicator.Text = "Compressing images..."; await Task.Run(() => UploadContacts()); } }


修改

响应您最近的更改:您需要重新设计。试试这个:

BeginInvoke

答案 3 :(得分:0)

尝试类似的东西:

        bool backContact = chkContacts.IsChecked.Value;
        bool backImages = chkImages.IsChecked.Value;
        Task.Factory.StartNew(() =>
                    {
                        if (backContact) {
                            Dispatcher.BeginInvoke(() =>
                            {
                                SystemTray.ProgressIndicator.Text = "Searching contacts...";
                            });
                            UploadContacts;
                        });
                    }).ContinueWith(() =>
                        {
                            if (backImages) {
                                Dispatcher.BeginInvoke(() =>
                            {
                                SystemTray.ProgressIndicator.Text = "Compressing images...";
                            });
                            UploadImages;
                            }
                        }