【发布时间】:2012-11-26 23:23:58
【问题描述】:
我创建了一些示例 ViewModel 来测试使用 asyncCtp 的 DP:
public class SampleVm : DependencyObject
{
public static readonly DependencyProperty SampleDependencyPropertyProperty =
DependencyProperty.Register("SampleDependencyProperty", typeof (int), typeof (SampleVm), new PropertyMetadata(default(int)));
public int SampleDependencyProperty
{
get { return (int) GetValue(SampleDependencyPropertyProperty); }
set { SetValue(SampleDependencyPropertyProperty, value); }
}
public ISampleModel _model;
public SampleVm(ISampleModel model)
{
_model = model;
}
public async Task SetDependencyProperty()
{
var modelData = await TaskEx.Run(() => _model.GetSomeIntegerValue());
SampleDependencyProperty = modelData;
}
}
注入到 ViewModel 的模型是:
public interface ISampleModel
{
int GetSomeIntegerValue();
}
public class SampleModel : ISampleModel
{
public int GetSomeIntegerValue()
{
return 10;
}
}
当我运行 WPF 应用程序时没有问题,但是当我想用以下代码对其进行测试时:
[Fact]
public async Task CheckValueSetting()
{
var model = new Mock<ISampleModel>();
model.Setup(x => x.GetSomeIntegerValue()).Returns(5);
var viewModel =new SampleVm(model.Object);
await viewModel.SetDependencyProperty();
Assert.Equal(5, viewModel.SampleDependencyProperty);
}
我收到以下错误:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
Server stack trace:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at WpfApplication4.SampleVm.set_SampleDependencyProperty(Int32 value) in SampleVM.cs: line 19
at WpfApplication4.SampleVm.<SetDependencyProperty>d__1.MoveNext() in SampleVM.cs: line 30
Exception rethrown at [0]:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at WpfApplication4.SampleVmFixture.<CheckValueSetting>d__0.MoveNext() in SampleVmFixture.cs: line 16
那么解决办法是什么?
【问题讨论】:
-
我可以检查一下:你为什么还在使用异步 CTP?现在这不是核心 .NET 的全部内容吗?
-
由于公司的限制,我必须使用.Net framework 4。
-
这完全没有意义。根据定义,CTP 完全不受支持,在这种情况下,现在已过时。没有比面对升级更好的选择了。 IMO:进行升级(即使这意味着在内部进行一些工作),或者忘记异步。最后:无论如何,大部分异步内容都在 4.0 中!!!
-
以 .NET 4 为目标是有道理的,特别是因为“就地”4.5 升级不支持 XP。他可能只是不知道 Microsoft.Bcl.Async。
-
感谢@MarcGravell 和 StephenCleary 的建议。在阅读了这个question 和这个blog on MSDN 之后,我认为解决方案不是继续使用AsyncCtp。
标签: c# mvvm async-ctp xunit.net