⑴ C# c/s 从不是创建控件“listBox1”的线程访问它。
public Form1( )
{
InitializeComponent ( );
Form1. = false;
}
⑵ C#如何在线程中访问控件对象
利用ListView.Invoke解决跨线程安全调用,关键代码如下:
voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨线程调用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接调用
listView2.Items.Add(path);
}
}//EndofFindFileInDir
⑶ C#多线程如何调用主线程创建的控件
1.新开的线程是无法直接访问UI控件的,如果需要访问,可以通过控件的Invoke方法,或者用
System.Threading.SynchronizationContext.Current.Post方法
2.一定不要在控件的内部事件处理方法里面使用Sleep等线程暂停方法!
像我这样写就不会阻塞了:
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
while (true)
{
this.Invoke(new Action(() =>
{
label1.Text = (count++).ToString();
}));
System.Threading.Thread.Sleep(100);
}
});
thread.IsBackground = true;
thread.Start();
}
你把setmess这个线程方法Invoke到了UI的主线程上了,而这个线程里面有暂停方法,所以呢主线程也会暂停卡住。
而我的方法只是把“label1.Text = (count++).ToString();”Invoke到主线程,而那个新的线程并没有Invoke到主线程,所以在那个线程里面使用暂停就没事了!
假如有一个操作比较费时,或者需要等待之类的,就像我这样开始一个新的线程,所以的等待操作,费时的操作都在在这个线程里面做,当这些线程需要访问UI控件的时候,就用this.Invoke()这个方法!
⑷ c#跨线程访问控件,为什么Thread对象不能写在方法里面
线程如果是个死循环 你想想程序会不会一直卡在某个语句不动了呢 线程虽然独立于主UI线程 但是你启动线程的语句在程序执行的过程中是要跳出的 否则会卡在t1.start();这一行 那样你如何修改btn的caption
⑸ c# 跨线程访问控件
那你可以在停止线程代码后再加上销毁excel资源的代码啊。
Microsoft.Office.Interop.Excel.Application属于不可托管资源,不会自动释放的。
⑹ VC 如何在线程里调用主窗口的控件
关键的步骤就是获取实际窗口指针(句柄)。
不同程序和模式获取方式不同,一般可以通过参数传递、AfxGetMainWnd等MFC函数获取、全局变量、共享内存等方式获取,第一种最简单,其它的各有要求。
获取指针后GetSafeHandle可以获取句柄,然后SendMessage即可。
⑺ C#怎么跨线程访问控件
只能用委托,不推荐 = false; 这种做法。
推荐一个封装好的 InvokeHelper 类(http://www.cnblogs.com/conmajia/archive/2012/08/05/multithread-gui-invoker.html),使用时只需要:
InvokeHelper.Invoke(<控件名>,"<方法名称>",<参数>);
InvokeHelper.Get(<控件名>,"<属性名称>");
InvokeHelper.Set(<控件名>,"<属性名称>",<属性值>);
即可。
⑻ C# 子线程访问主窗体控件
是的,
在其他线程里,不允许调用主线程创建的控件~!!!!
这样做,是不安全的,因此,2.0屏蔽了这个~
楼上说的很对,用委托,具体代码如下~:
public delegate void MyInvoke(string str);
private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
// = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}
private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}
⑼ C#中多线程里面如何调用控件
定义委托,然后用invoke
private void ucMidPartsid_Load(object sender, EventArgs e)
{
if (is_Load == true)
{
thread = new Thread(new ThreadStart(this.LoadData));
thread.Start();
}
//if (datafinish != null)
//{
// datafinish(this, e);
//}
}
private void LoadData()
{
QueryDataCallBack deleg;
deleg = new QueryDataCallBack(this.DataBinding);
this.Invoke(deleg,null);
}
private void DataBinding()
{
partstableAdapter = new GreatWall.SCM.Parts.DataAccess.DAParts.PartsTableAdapter();
partstableAdapter.Fill(dsParts.GB_PARTS);
cobMidPartsid.DataSource = dsParts.GB_PARTS;
cobMidPartsid.DisplayMember = "B_PARTSID";
cobMidPartsid.ValueMember = "B_ID";
EventArgs e = new EventArgs();
if (datafinish != null)
{
finish = true;
datafinish(this, e);
}
}
⑽ C#类线程中调用窗体控件
应该是这里出了问题:
this.box.Items.Add(ClientNum
+
":号用户已上线");
委托实现异步执行的时候,使用到了不在它线程内定义的界面对象,出错!
所以,应该改为:
this.box.Invoke(new
Action<string>(AddClient),
ClientNum.ToString());
void
AddClient(string
num)
{
his.box.Items.Add(num+
":号用户已上线");
}