我已经为自己遇到的一个异常(其中两个)苦苦挣扎了几个小时。问题似乎与 WP8.1 的设备(我使用的是Lumia 820,调试/发布模式无关紧要)有关 - 在模拟器上工作正常(我没有进行太多测试)。它也很难跟踪和重现 - 所以我添加完整的代码以防有人想尝试。
我有一个列表框,其中填充了一个按钮:
public sealed partial class MainPage : Page
{
List<string> populationOfItems = new List<string>();
ObservableCollection<string> itemsToView = new ObservableCollection<string>();
public MainPage()
{
this.InitializeComponent();
first.Click += first_Click;
myList.ItemsSource = itemsToView;
myList.SelectionChanged += myList_SelectionChanged;
for (int i = 0; i < 6; i++) populationOfItems.Add("Item " + i.ToString());
BottomAppBar = new CommandBar();
}
private void first_Click(object sender, RoutedEventArgs e)
{
itemsToView.Clear();
for (int i = 0; i < 12; i++)
itemsToView.Add("Example " + i.ToString());
}
这行得通。然后当我选择项目时,我想更改我的 ObservableCollection:
private async void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (myList.SelectedItem != null)
{
itemsToView.Clear();
await PopulateList();
}
}
private async Task PopulateList()
{
await Task.Delay(100); // running asynchronous seems to make a problem
itemsToView.Add("FIRSTELEMENT");
foreach (var item in populationOfItems)
itemsToView.Add(item);
}
问题来了 - 重现模式:
- 单击第一个按钮以填充列表框
- 向下滚动列表框
- 例如,当 Listbox 向下移动时(如果没有发生问题,请尝试几次重新启动)点击 Item 9。
我得到以下异常:
奇怪的是,过了一会儿(当你用鼠标单击其他地方时)然后尝试再次查看异常 - 它变为:
这个问题似乎与异步运行有关Task PopulateList()
(这就是为什么我也标记了这个问题asynchronous
) - 如果它在没有线路的情况下同步运行await Task.Delay(100);
,它似乎工作正常。
有谁知道可能出了什么问题?
编辑- 更多信息
我无法使用任何 try-catch 块来捕获异常。
我也尝试通过Dispatcher
- 填充 Collection,但没有成功。
我尝试先填充一个临时对象List<string>
,然后在完成后将await PopulateList();
项目复制到ObservableCollection
- 这也没有帮助。