0

Visual C# で、コンピューター上のデバイスを検索するカスタム UserControl を作成しました。

例:

public class MyControl : UserControl
{
    private Thread _searchThread;
    private bool _found;

    public MyControl()
    {
        InitializeComponents();
        _searchThread = new Thread(search);
        _searchThread.Start();
    }

    private void search()
    {
        while(!_found)
        {
            //search
        }
    }
}

このコントロールを別のコントロールに追加すると、設計時エラーが発生し、次のスタック トレースで FileNotFound 例外が発生します。

StackTrace: System.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) の MyControl.search() で System.Threading.ExecutionContext.Run(ExecutionContext の executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の ignoreSyncCtx) でSystem.Threading.ThreadHelper.ThreadStart() での ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態)

_searchThread.Start() をコメントアウトすると、すべてが機能します。

ここで何が起こっているのか、またはこれを修正する方法を知っている人はいますか?

4

2 に答える 2

3

ここで何が起こっているのか、またはこれを修正する方法を知っている人はいますか?

前に述べたように、コントロールは設計時にデフォルトのコンストラクターでインスタンス化されます。これを修正するには、実行時に明示的に呼び出される別のメソッドを追加するコンストラクターから副作用 (検索やその他の実行時のみのアクションなど) を取得することを検討してください。

public MyControl()
{
    InitializeComponents();
}


public void Activate() 
{
    if (_activated) 
    {
        return;
    }

    _activated = true;
    _searchThread = new Thread(search);     
    _searchThread.Start();
}
于 2012-07-18T21:34:34.200 に答える
1

設計時に、Visual Studio は をインスタンス化しようとするMyControlため、コントロールの (既定の) コンストラクターを実行しています。ただし、コンストラクターは制約のある環境で実行されるため、search()期待する前提条件が満たされない可能性があります (もちろん、他のグローバル オブジェクトにはアクセスできません)。したがって、コードがクラッシュします。

あなたは何ができますか?簡単です。Visual Studio Designer によって実行されていることを検出でき、この場合はスレッドを開始しません。

このようなもの:

public MyControl()
{
    InitializeComponents();
    if (DesignerProperties.GetIsInDesignMode(this))
        return;
    _searchThread = new Thread(search);
    _searchThread.Start();
}
于 2012-07-18T21:28:47.160 に答える