相关疑难解决方法(0)

在单元测试中使用WPF Dispatcher

我无法让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永远不会在委托中运行代码.

.net c# wpf unit-testing dispatcher

48
推荐指数
4
解决办法
3万
查看次数

运行多个C#任务异步

嗨,通常我会用背景工作者这样做,但我想用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()完成时调用.

我需要它能够工作异步,因为我不知道每个任务何时完成,或者即使它将完成.

.net c# multithreading c#-4.0

9
推荐指数
1
解决办法
3万
查看次数

如何通知父线程所有子线程都已终止?

我有一个控制台应用程序,我正在移植到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)

c# multithreading

7
推荐指数
1
解决办法
1842
查看次数

WPF中ViewModel的异步UI更新

我遇到从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)

wpf multithreading mvvm-light

5
推荐指数
1
解决办法
7200
查看次数

标签 统计

c# ×3

multithreading ×3

.net ×2

wpf ×2

c#-4.0 ×1

dispatcher ×1

mvvm-light ×1

unit-testing ×1