【发布时间】:2015-11-09 06:41:20
【问题描述】:
我正在从 WCF 服务调用数据并在我的 WPF 应用程序中填充一个组合框。一旦我导航到组合框的位置,页面就会冻结,或者有时我可以打开组合框但它也会冻结?
WPF
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
using (TruckServiceClient TSC = new TruckServiceClient())
{
await LoadPhase(TSC, cmbtest);
}
private async Task LoadPhase (TruckServiceClient TSC, ComboBox combobox)
{
List<Phasetems> phasetems = new List<Phasetems>();
foreach (var item in await TSC.GetphaseAsync())
phasetems.Add(new Phasetems { Phase = item.Phase });
combobox.ItemsSource = (phasetems.ToArray());
combobox.IsEnabled = true;
combobox.SelectedIndex = 1;
}
public class Phasetems
{
public int Id { get; set; }
public string Phase { get; set; }
public override string ToString()
{
return Phase;
}
}
WCF
public List<RPhases> Getphase()
{
List<RPhases> phases = new List<RPhases>();
List<RPhases> dbphase;
using (TruckDb db = new TruckDb())
dbphase = db.RPhases.Where(x => x.Id != null).ToList();
foreach (var a in dbphase)
{
var items = new RPhases
{
Id = a.Id,
Phase = a.Phase
};
phases.Add(items);
}
return phases;
}
【问题讨论】:
-
你确定是挂了还是后台隐藏了异常?每当您想从后台线程(即组合框)更新控件时,都需要调用 CheckAccess/BeginInvoke
-
await的默认行为是返回调用异步方法的线程。所以他不需要打电话给 CheckAccess 左右。 @RGdent:会不会有其他东西阻塞了 ui 线程?另一个 Loaded-handler 左右? -
不,根本没有任何其他加载器@christoph,不仅组合框冻结,程序也冻结。
-
列表很大吗?您可能需要虚拟化:stackoverflow.com/questions/8198645/…
-
您是否在没有服务调用的情况下尝试过?只是为了确保没有其他东西阻塞?