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を学んでおり、ネストされたオブジェクトを平坦化する関数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 に答える