0

我需要帮助:我有一个带有关联线程的嵌套对象:

public class XNodeViewModel 
{
    private int id;
    private Thread workerThread;
    private bool _alivingThread;
    readonly ObservableCollection<XNodeViewModel> _children;

    private XNodeViewModel(...)
    {
        ...
        if (...)
        {
            workerThread = new Thread(DoWork) { IsBackground = true };
            workerThread.Start();
        }
    }
    public ObservableCollection<XNodeViewModel> Children
    {
        get { return _children; }
    }

    public int Level
    {
        get { return _xnode.Level; }
    }
    public Thread WorkerThread
    {
        get { return this.workerThread; }
    }
}

在后面的 wpf 代码中,我引用了这个 ViewModel 并且我想要关联所有线程对象。我正在学习 Linq,我知道有 Function SelectMany 来展平嵌套对象:使用一个按钮,我想用这个函数停止所有线程:

public void StopAllThread()
{
    //_firstGeneration is my root object
    var threads = _firstGeneration.SelectMany(x => x.WorkerThread).ToList();
    foreach( thread in threads){
        workerThread.Abort();
    }
}

但是编译器告诉我:

错误 1 ​​无法从用法中推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable, System.Func>)”的类型参数。尝试明确指定类型参数。

只有当我请求类型“线程”时。(如果我请求另一种类型的对象是可以的)我在哪里做错了?

4

1 回答 1

2

您需要使用Select而不是SelectMany

var threads = _firstGeneration.Select(x => x.WorkerThread);
foreach(thread in threads)
    workerThread.Abort();

SelectMany用于展平列表列表。您的WorkerThread属性不返回列表,因此SelectMany是错误的方法。

于 2013-02-06T09:46:35.403 回答