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# 异常:应用程序调用了为不同线程封送的接口 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

我在行字符串uri=trainGrabber.GetUrl(Suggestions.Text,Suggestions1.Text,date)中遇到了这个错误;因为调用打开了一个新线程,我如何修复它?
应用程序调用了为不同线程封送的接口。

问题是您从新的
任务
调用了
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));
}