当前位置:编程学习 > C#/ASP.NET >>

winform 多线程程序如何读取窗体上控件的值?


winform 多线程程序 写入窗体上控件的值,MSDN上有例子,可要读取值该怎么处理呢?
delegate void SetTextCallback(string text);

private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
--------------------编程问答-------------------- 把整个Form定义加个Volatile关键字,可以直接从不同的线程访问,就是安全性不太好. --------------------编程问答-------------------- 不能直接读吗? --------------------编程问答-------------------- delegate string GetTextCallback(); 

private string GetText() 

string rtext;
if (this.textBox1.InvokeRequired) 

GetTextCallback d = new GetTextCallback(GetText); 
this.Invoke(d); 

else 

rtext=this.textBox1.Text; 

return rtext;


不知道这样行不行 没有试  你可以试一下 --------------------编程问答-------------------- 参考 --------------------编程问答-------------------- 采用委托+事件 --------------------编程问答-------------------- 加lock会降低多线程带来的性能提高,只能加Volatile关键字了 --------------------编程问答-------------------- mark. --------------------编程问答-------------------- 直接读取最好不要用,用类与类之间传递值方式吧。例如:
class a 
{
public a(string s)
{

}
}

class b
{
  public void f()
{
   a a1 = new a("s");
}
}
在构造函数里面传递值 --------------------编程问答-------------------- 希望对你又帮助 --------------------编程问答-------------------- 根据实际需要使用。可以使用异步委托的方式来处理,因为只是读取,所以是线程安全的。 --------------------编程问答--------------------
引用 3 楼 ggbb190 的回复:
delegate string GetTextCallback();

private string GetText()
{
string rtext;
if (this.textBox1.InvokeRequired)
{
GetTextCallback d = new GetTextCallback(GetText);
this.Invoke(d);
}
else
{
rtext=this.textBox1.Text;
}
return rtext;
}

不知道这样行不行 没有试  你可以试一下


up --------------------编程问答-------------------- //vs2008下通过

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ReceiveClass myReceiveClass = new ReceiveClass(this,textBox1);

            Thread ListenThread = new Thread(new ThreadStart(myReceiveClass.ReceiveMessage));
            ListenThread.Start();

        }
    }



    class MyEventArgs : EventArgs
    {
        public string InsertText;
    }

    class ReceiveClass
    {
        private Form1 mySender;
        private TextBox pTextBox;

        public ReceiveClass(Form1 Sender, TextBox TextBox1)
        {
            mySender = Sender;
            pTextBox = TextBox1;
        }

        public void ReceiveMessage()
        {
                //解决跨线程调用windows窗体控件
                MyEventArgs MyMessage = new MyEventArgs();
                mySender.Invoke(new EventHandler(readText), new object[] { mySender, MyMessage });

            //读取form1 上textBox1.Text 的值
                string s=MyMessage.InsertText ;
        }

        private void readText(object sender, EventArgs e)
        {
            MyEventArgs ec = (MyEventArgs)e;
            ec.InsertText=pTextBox.Text;
        }
    }

}


http://www.mybuffet.cn --------------------编程问答--------------------
引用 11 楼 lfs09 的回复:
引用 3 楼 ggbb190 的回复:
delegate string GetTextCallback();

private string GetText()
{
string rtext;
if (this.textBox1.InvokeRequired)
{
GetTextCallback d = new GetTextCallback(GetText);
this.Invoke(d);
}
else
{
rtext=this.textBox1.Text;
}
return rtext;
}

不知道这样行不行 没有试  你可以试一下


up



up
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,