我无法让Dispatcher运行委托我在单元测试时传递给它.当我运行程序时,一切正常,但是,在单元测试期间,以下代码将无法运行:
this.Dispatcher.BeginInvoke(new ThreadStart(delegate
{
this.Users.Clear();
foreach (User user in e.Results)
{
this.Users.Add(user);
}
}), DispatcherPriority.Normal, null);
Run Code Online (Sandbox Code Playgroud)
我在我的viewmodel基类中有这个代码来获取Dispatcher:
if (Application.Current != null)
{
this.Dispatcher = Application.Current.Dispatcher;
}
else
{
this.Dispatcher = Dispatcher.CurrentDispatcher;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要做一些事情来初始化Dispatcher进行单元测试?Dispatcher永远不会在委托中运行代码.
嗨,通常我会用背景工作者这样做,但我想用C#Task来做,只是为了更好地理解Task.
问题是我有一个具有以下属性的类
private int _number1;
public int Number1
{
get { return _number1; }
set { _number1 = value; OnPropertyChanged("Number1");}
}
private int _number2;
public int Number2
{
get { return _number2; }
set { _number2 = value; OnPropertyChanged("Number2");}
}
Run Code Online (Sandbox Code Playgroud)
请注意我使用INotifyPropertyChanged.
Number1 = Task<int>.Factory.StartNew(() => GenerateResult()).Result;
Number2 = Task<int>.Factory.StartNew(() => GenerateResult2()).Result;
Run Code Online (Sandbox Code Playgroud)
GenerateResult和GenerateResult2只是dumme方法,他们睡觉然后返回一个数字.
我如何使这项工作异步?从现在开始,GenerateResult2()首先在GenerateResult()完成时调用.
我需要它能够工作异步,因为我不知道每个任务何时完成,或者即使它将完成.
我有一个控制台应用程序,我正在移植到WPF.该应用程序有3个工作线程,在将一些输出结果打印到屏幕之前,它们都连接到主线程.我的理解是,如果我尝试在WPF应用程序中执行相同的操作,GUI将被阻止,并且不会对用户产生反应.那么如何通知父线程所有线程都已完成其工作?我认为解决方案将涉及委托和事件(或者可能是BackgroundWorker?),但我不清楚如何在线程终止时调用回调.
原始代码:
foreach (Thread t in threadList)
{
t.Start();
}
foreach (Thread t in threadList)
{
t.Join();
}
// print some results here
Run Code Online (Sandbox Code Playgroud) 我遇到从db获取数据并在UI中异步显示的问题.我正在使用MVVM灯,当我单击按钮时,在ViewModel中触发操作:
private void SearchQuery(string query)
{
_redisModel.GetFriendsListAsync(query);
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,GetFriendsListCompleted由后台线程调用,通知viewmodel作业已完成.此时我需要更新ListBox ItemSource.但是当我尝试更新时,我得到 "调用线程无法访问此对象,因为另一个线程拥有它" 我已经尝试过 Dispatcher.CurrentDispatcher.Invoke(),App.Current.Dispatcher.Invoke()和不同的魔法,但它仍然无法正常工作.
我试图将UI调度程序提供给ViewModel,然后从那里调用它 - 没有用.
private string filterText = string.Empty;
public string FilterText
{
get { return filterText; }
set
{
filterText = value;
this.RaisePropertyChanged(() => this.FilterText);
this.FriendsList.View.Refresh(); // Here where exception is happening.
}
}
Run Code Online (Sandbox Code Playgroud)
我试图改变这一行
Dispatcher.Invoke(DispatcherPriority.Normal,new Action(()=> this.FriendsList.View.Refresh())); - 还是一样.
我正在使用Telerik ListBox来显示项目.FriendList是CollectionViewSource(http://www.telerik.com/help/wpf/radlistbox-overview.html).当我在WPF控件示例中使用Telerik示例时,它可以正常工作.当我使用异步方法时,问题开始出现.视图类型是System.ComponentModel.ICollectionView,它用于过滤和分组.
我还尝试将ObservableCollection分配给ListBox的Items属性,但它也不起作用.
关于_redisModel.GetFriendsListAsync如何工作的更多细节:最后(在所有调用链之后)它最终在这里:
public GetAsyncResult(Func<T> workToBeDone, Action<IAsyncResult> cbMethod, Object state)
{
_cbMethod = cbMethod;
_state = state;
QueueWorkOnThreadPool(workToBeDone);
}
ThreadPool.QueueUserWorkItem(state =>
{
try …Run Code Online (Sandbox Code Playgroud)