繁体   English   中英

在创建 window 句柄之前,无法在控件上调用 c# Invoke 或 BeginInvoke System.Threading.Thread

[英]c# Invoke or BeginInvoke cannot be called on a control until the window handle has been created System.Threading.Thread

不是Windows下的线程专家。 我有一个 Main WinForm 在它的 ctor 中打开一个子表单。

public partial class Main : Form
{
    public Main()
    {
        InitializeComponent();

        ImgRxUI formStart = new ImgRxUI();
        formStart.MdiParent = this;
        formStart.WindowState = FormWindowState.Maximized;
        formStart.Show();
    }

ETC..

ImgRxUI 表单(子表单)启动一个传递给 2 个操作(简单形式的委托)的线程。

 public partial class ImgRxUI : Form
{

    private ImgReceiver oImgReceiver = null;

    public ImgRxUI()
    {
        InitializeComponent();

        this.WindowState = FormWindowState.Maximized;
        this.ShowIcon = false;

        oImgReceiver = new ImgReceiver(UpdateImage, Log);
        oImgReceiver.startService();

    }



    public void UpdateImage(byte[] ProtocolType)
    {
       ...do stuff...

    }

    public void Log(string Text)
    {
        this.Invoke((MethodInvoker)delegate
        {
            LogMethod(Text);
            tLog.ScrollToCaret();
        });

    }

    private void LogMethod(string Text)
    {
        tLog.AppendText(Text + Environment.NewLine);
    }

正如我所说的 ImgReceiver 启动了一个在套接字上侦听的线程......

 public class ImgReceiver
{

    private Action<byte[]> ImgReceived;
    private Action<string> Log;
    private System.Threading.Thread Thread_ImgReceiver = null;

    public ImgReceiver(Action<byte[]> ImageReceivedDelegate, Action<string> LogDelegate)
    {
        
        this.ImgReceived = ImageReceivedDelegate;
        this.Log = LogDelegate;
    }

    public void startService()
    {
        Thread_ImgReceiver = new System.Threading.Thread(startListening);
        Thread_ImgReceiver.IsBackground = true;
        Thread_ImgReceiver.Start();
    }

    [SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
    public void killService()
    {
        Thread_ImgReceiver.Abort();
        System.Threading.Thread.Sleep(1000);
    }

    public void startListening()
    { ...do stuff...}

当我关闭 ImgRxUI 表单时,表单本身的以下事件被调用

 private void ImgRxUI_FormClosing(object sender, FormClosingEventArgs e)
    {
        oImgReceiver.killService();            
    }

听起标题中的错误。

什么?

塔克斯

将 kill Service 方法更改为

[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
public void killService(Action action)
{
   action.Invoke();
   System.Threading.Thread.Sleep(1000);
}

将访问级别 Thread_ImgReceiver 更改为 public

public System.Threading.Thread Thread_ImgReceiver = null;

并调用 killService 到

private void ImgRxUI_FormClosing(object sender, FormClosingEventArgs e)
{  
    oImgReceiver.killService(new Action(delegate { oImgReceiver.Thread_ImgReceiver.Abort(); }));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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