C# 异常:应用程序调用了为不同线程封送的接口 private async void按钮\u单击(对象发送方,路由目标) { 如果(!AutoCompletions.Contains(Suggestions.Text)| |!AutoCompletions.Contains(Suggestions1.Text)) { MessageDialog MessageDialog=新建MessageDialog(信息对话框); messageDialog.showsync(); 返回; } 任务getTrain=新任务(getTrainshelldure); MyUndeterminateProbar.Visibility=可见性.Visibility; 尝试 { this.Frame.Navigate(typeof(BlankPage3),wait getTrain); } 捕获(例外) { //在这里处理异常 } 最后 { MyUndeterminateProbar.Visibility=可见性.Visibility; } } 公共列车开行 { 字符串日期=DatePicker.date.Year+“-”+DatePicker.date.Month+“-”+DatePicker.date.Day; return TrainGrabber.GetTrainSheldure(Suggestions.Text,Suggestions1.Text,date); }
我在行字符串uri=trainGrabber.GetUrl(Suggestions.Text,Suggestions1.Text,date)中遇到了这个错误;因为调用打开了一个新线程,我如何修复它?C# 异常:应用程序调用了为不同线程封送的接口 private async void按钮\u单击(对象发送方,路由目标) { 如果(!AutoCompletions.Contains(Suggestions.Text)| |!AutoCompletions.Contains(Suggestions1.Text)) { MessageDialog MessageDialog=新建MessageDialog(信息对话框); messageDialog.showsync(); 返回; } 任务getTrain=新任务(getTrainshelldure); MyUndeterminateProbar.Visibility=可见性.Visibility; 尝试 { this.Frame.Navigate(typeof(BlankPage3),wait getTrain); } 捕获(例外) { //在这里处理异常 } 最后 { MyUndeterminateProbar.Visibility=可见性.Visibility; } } 公共列车开行 { 字符串日期=DatePicker.date.Year+“-”+DatePicker.date.Month+“-”+DatePicker.date.Day; return TrainGrabber.GetTrainSheldure(Suggestions.Text,Suggestions1.Text,date); },c#,multithreading,windows-store-apps,async-await,C#,Multithreading,Windows Store Apps,Async Await,我在行字符串uri=trainGrabber.GetUrl(Suggestions.Text,Suggestions1.Text,date)中遇到了这个错误;因为调用打开了一个新线程,我如何修复它? 应用程序调用了为不同线程封送的接口。问题是您从新的任务调用了getTrainshelldure,这意味着它在线程池线程上执行。在该方法中,您可以尝试访问XAML控件(例如DatePicker),并且只能从UI线程访问XAML控件 从任务调用getTrainshelldure有什么原因吗?例如,Tra
应用程序调用了为不同线程封送的接口。问题是您从新的
任务
调用了getTrainshelldure
,这意味着它在线程池线程上执行。在该方法中,您可以尝试访问XAML控件(例如DatePicker
),并且只能从UI线程访问XAML控件
从任务调用getTrainshelldure
有什么原因吗?例如,TrainGrabber.getTrainshelldure
是一项昂贵的操作吗?如果是这样,您应该在开始新的任务之前从控件捕获值。如果它不昂贵,那么只需删除任务的用法即可
大概是这样的:
private async void Button_Click(object sender, RoutedEventArgs e)
{
if (!AutoCompletions.Contains(Suggestions.Text) || !AutoCompletions.Contains(Suggestions1.Text))
{
MessageDialog messageDialog = new MessageDialog("Один или оба пункта не существует");
messageDialog.ShowAsync();
return;
}
Task<Train> getTrain=new Task<Train>(GetTrainSheldure);
myIndeterminateProbar.Visibility = Visibility.Visible;
try
{
this.Frame.Navigate(typeof (BlankPage3), await getTrain);
}
catch (Exception)
{
//handle the exception here
}
finally
{
myIndeterminateProbar.Visibility = Visibility.Visible;
}
}
public Train GetTrainSheldure()
{
string date = DatePicker.Date.Year + "-" + DatePicker.Date.Month + "-" + DatePicker.Date.Day;
return TrainGrabber.GetTrainSheldure(Suggestions.Text, Suggestions1.Text, date);
}
//在按钮中单击
var train=等待getTrainshelldure();
//方法
公共异步任务GetTrainsSheldure()
{
var date=DatePicker.date.Year/…等。
var suggestion=Suggestions.Text
var suggestion1=Suggestions1.Text
返回Task.Run(()=>TrainGrabber.getTrainshelldure(建议,建议1,日期));
}
我还没有运行此代码,但您应该能够让它工作。关键是在创建任务之前访问所有XAML控件,,
,我怀疑是否有人能告诉你为什么TrainGrabber不是一个敏捷类,或者它的GetUrl()方法使用的对象不是线程安全的。和写它的人谈谈。我重写了这个方法,也许现在他是线程安全的?我想在任务执行时形状不会冻结
// in Button_Click
var train = await GetTrainSheldure();
// method
public async Task<Train> GetTrainSheldure()
{
var date = DatePicker.Date.Year // ... etc.
var suggestion = Suggestions.Text
var suggestion1 = Suggestions1.Text
return Task.Run(()=>TrainGrabber.GetTrainSheldure(suggestion, suggestion1, date));
}