在自定义UserControl中使用线程时的设计时错误(FileNotFoundException)

时间:2012-07-18 21:24:39

标签: c# user-controls filenotfoundexception

在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异常与此堆栈跟踪:

堆栈跟踪:        在MyControl.search()        在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)        在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)        在System.Threading.ThreadHelper.ThreadStart()

现在,当我注释掉_searchThread.Start()时,一切正常。

有谁知道这里发生了什么或如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

  

有谁知道这里发生了什么或如何解决这个问题?

如前所述,控件在设计时使用默认构造函数进行实例化。要解决此问题,请考虑从构造函数中添加一个名为expicitly的单独方法,以便在runntime中添加副作用(如搜索和其他仅运行时操作)。

public MyControl()
{
    InitializeComponents();
}


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

    _activated = true;
    _searchThread = new Thread(search);     
    _searchThread.Start();
}

答案 1 :(得分:1)

嗯,在设计时Visual Studio尝试实例化MyControl,因此它正在执行控件的(默认)构造函数。但是,构造函数在受约束的环境中执行,因此可能不满足search()期望的前提条件(其他全局对象当然不可访问)。所以你的代码崩溃了。

你能做什么?嗯,这很简单:您可以检测到您是由Visual Studio Designer运行的,并且在这种情况下不启动该线程。

这样的事情:

public MyControl()
{
    InitializeComponents();
    if (DesignerProperties.GetIsInDesignMode(this))
        return;
    _searchThread = new Thread(search);
    _searchThread.Start();
}