静态线程功能的访问控制元素 [英] Access control element from static thread function

查看:56
本文介绍了静态线程功能的访问控制元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了很多有关此内容的信息,并且尝试了以下方法:

I ve read lots of information about this stuff and i tried this:

class Server
{
... 
  public Server(int Port, ListBox ex_lb, PictureBox ex_pb)
  {
    ServerWork = new Thread(() => ServerFunction(Listener, ex_lb, ex_pb));
    ServerWork.Start();
  }
  static void ServerFunction(TcpListener ex_listener, ListBox ex_lb, PictureBox ex_pb)
  {
    //and any access to ex_lb throws exception, didnt debug to access to ex_pb
  }
}

此:

private static IncomingDataClass g_IDC = new IncomingDataClass();

private class IncomingDataClass
{
  static string data = "";
  public string Data
  {
    get { return data; }
    set { 
      data = value;
      SomeEvent(this,null,data);
    }
  }            
}

void IncomingDataClass_SomeEvent(object sender, EventArgs e, string ex_data)
{
  if (ex_data.Contains("listbox"))
  {
    ex_data = ex_data.Remove(ex_data.IndexOf("listbox"), "listbox".Length);
    listBox1.Items.Add(ex_data);
  }
}

delegate void MyEventHandler(object sender, EventArgs e, string ex_data);
static event MyEventHandler SomeEvent;
// in form load event
SomeEvent += IncomingDataClass_SomeEvent;
class Server
{
... 
  public Server(int Port, ListBox ex_lb, PictureBox ex_pb)
  {
    ServerWork = new Thread(() => ServerFunction(Listener));
    ServerWork.Start();
  }
  static void ServerFunction(TcpListener ex_listener)
  {
    //and any change of g_IDC.Data throws exception here
  }
}

此:

private static ListBox listBox1 = new ListBox();

private void Form1_Load(object sender, EventArgs e)
{
  ...
  listBox1.FormattingEnabled = true;
  listBox1.Location = new System.Drawing.Point(12, 256);
  listBox1.Name = "listBox1";
  listBox1.Size = new System.Drawing.Size(258, 108);
  listBox1.TabIndex = 6;
  Controls.Add(listBox1);
}
//anyways, even if i create new ListBox lb = listBox1 in ServerFunction(..), it throws System.InvalidOperationException => Access attempt to listBox1 not from thread where is was created.

我做错了什么?我以为创建静态控件是解决此问题的最终方法,但即使这样也不起作用...

What do i do wrong? I thought that creating static control is an ultimate problem solve for this, but even this doesnt work...

推荐答案

如果我没有记错,为了从另一个线程更新UI,则需要使用以下调用:

If I remember correctly in order to update the UI from another thread you need to use this invocation:

this.Invoke((MethodInvoker)delegate
    {
        MethodForUpdatingUI();
    });

这将从UI线程开始MethodForUpdatingUI(),使您能够访问控件.

This will start MethodForUpdatingUI() from the UI thread, enabling you to access the controls.

因此,为了在您的代码中使用此代码,我将尝试更改IncomingDataClass_SomeEvent:

So, for use this in your code I'll try to change IncomingDataClass_SomeEvent:

void IncomingDataClass_SomeEvent(object sender, EventArgs e, string ex_data)
{
        this.Invoke((MethodInvoker)delegate
        {
            UpdateListBox(ex_data);
        });
}

UpdateListBox(string ex_data)
{
  if (ex_data.Contains("listbox"))
  {
    ex_data = ex_data.Remove(ex_data.IndexOf("listbox"), "listbox".Length);
    listBox1.Items.Add(ex_data);
  }
}

如果不是您要的情况,或者是很糟糕的做法,请随时纠正我.我尚未测试代码.

Please feel free to correct me if this is not the case you are asking for or this is a bad pratice. I've not tested the code.

这篇关于静态线程功能的访问控制元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆