我想要接下来调用两种或更多种方法。当一个函数执行完成后,我需要调用另一个方法。基本上我正在尝试在我的应用程序中实现备份功能。我正在开发 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);
答案 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;
}
}