繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM