在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()时,一切正常。
有谁知道这里发生了什么或如何解决这个问题?
答案 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();
}