IValueConverter 和 asyncch DomainService Invoke in C# 的问题
本文关键字:问题 in Invoke asyncch DomainService IValueConverter | 更新日期: 2023-09-27 18:36:29
在我的搜索中,此问题的常见解决方案是在调用操作完成后添加一个事件处理程序进行处理。
不幸的是,我的 IValueConverter 需要返回一个值,因此拥有处理程序没有多大帮助。我还尝试了 do/while 循环,直到操作完成但循环永远不会关闭。
我也尝试了一个简单的等待操作,但它仍然返回 null。我知道我的域服务返回正确的值,但转换器永远不会看到它。
在这种情况下,我能做些什么吗?拥有一个有效的转换器将消除/减少几乎所有我可以预见的未来问题。
我的代码:(我需要这样的东西来工作)
InspectDomainContext context = new InspectDomainContext();
string name;
InvokeOperation<string> inv;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string id = (string)value;
inv = context.GetName(id);
inv.Completed += new EventHandler(inv_Completed);
// return here after the handler has completed
return name;
}
void inv_Completed(object sender, EventArgs e)
{
name = inv.Value;
}
(新答案,因为它与第一个完全不同!
这假定您正在使用某种 ViewModel 数据上下文模式...
您可以在ViewModel 上创建第二个属性来保存转换后的值,而不是在 IValueConverter
中执行此操作。
public class MyViewModel
{
private string _id;
public string Id
{
get { return _id; }
set
{
_id = value;
UpdateConvertedName(_id);
}
}
private void UpdateConvertedName(string id)
{
// Same as your 'Convert' code above
}
private void inv_Completed(object sender, EventArgs e)
{
Name = inv.Value;
}
public string Name { get; set; }
}
因此,无需使用转换器绑定到 ID,只需直接绑定到 Name。每当 ID 更改时,名称都将异步更新。您可能还需要在名称获取器/设置器中进行一些INotifyPropertyChanged
,如果您使用的是 ViewModels,那么您已经熟悉所有这些。
由于您坚持使用异步调用,因此可能还值得添加一些 UI 指示符,指示值已旧或不完整 - 我不知道您的设置是什么,但理论上客户端计算机可能位于世界另一端的 28.8k 连接上或非常慢的移动设备上,因此您的响应时间会非常差。但这与手头的答案并不真正相关!
你能同步调用它吗?
return context.GetName(id.ToString());
否则,您可能不得不等待 .NET 4.5 和 async/await 关键字,据我了解(我自己还没有玩过它),这将允许您在方法中的某个位置放置一个"等待"点,以便在异步部分完成之前不继续。
但是,无法使异步调用的行为像您所要求的同步调用一样。为什么它需要异步?