[英]Design-Time error (FileNotFoundException) when using Threads in custom UserControl
在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(对象状态)处于System.Threading.ExecutionContext.Run(对象状态)处于System.Threading.ExecutionContext.Run(对象状态) System.Threading.ThreadHelper.ThreadStart()处的ExecutionContext executeContext,ContextCallback回调,对象状态)
现在,当我注释掉_searchThread.Start()时,一切正常。
有谁知道这里发生了什么或如何解决?
有谁知道这里发生了什么或如何解决?
如前所述,在设计时使用默认构造函数实例化控件。 要解决此问题,请考虑从构造函数中采取副作用(例如搜索和其他仅运行时的操作),并在运行时添加一个单独的方法,即显式调用。
public MyControl()
{
InitializeComponents();
}
public void Activate()
{
if (_activated)
{
return;
}
_activated = true;
_searchThread = new Thread(search);
_searchThread.Start();
}
好吧,在设计时,Visual Studio尝试实例化MyControl
,因此它正在执行控件的(默认)构造函数。 但是,构造函数是在受约束的环境中执行的,因此也许不满足您search()
期望的前提条件(其他全局对象当然是不可访问的)。 因此,您的代码崩溃了。
你能做什么? 好吧,这很简单:您可以检测到您由Visual Studio Designer运行,并且在这种情况下不启动线程。
像这样:
public MyControl()
{
InitializeComponents();
if (DesignerProperties.GetIsInDesignMode(this))
return;
_searchThread = new Thread(search);
_searchThread.Start();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.