winform在分支线程中处理后如何返回给UI线程?

ysugstar 2019-06-20 07:51:36
上位机程序用winform实现。机器启动之后,工作线程开启。开启的时候需要不断改变textbox.text或者label.text参数,比如显示启动,复位,或者检测数量等。那么每次通过委托,异步的方法虽然可以实现,但是非常麻烦。有没有一种比较好的方法可以将工作和显示解耦?或者用其他方法实现?
...全文
157 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
苏克贝塔 2019-06-21
  • 打赏
  • 举报
回复
 //数据处理类
public delegate void ListenerHandler();
public class DataProcess
{
public event ListenerHandler OnDataChangeEvent = null;

public DataProcess()
{
System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒;

t.Elapsed += new System.Timers.ElapsedEventHandler(DoSomeThing);//到达时间的时候执行事件;
t.AutoReset = true;
t.Enabled = true;
}
public void DoSomeThing(object source, System.Timers.ElapsedEventArgs e)
{
if (OnDataChangeEvent != null)//确定事件已被订阅(注册过)
{
OnDataChangeEvent();//触发事件
}
}
}

 class Program
{
static void Main(string[] args)
{
DataProcess dd = new DataProcess();

dd.OnDataChangeEvent += new ListenerHandler(ShowData);//订阅(注册)DataProcess类OnDataChangeEvent事件

Console.ReadKey();
}

//事件处理方法
private static void ShowData()
{
Console.WriteLine("DataProcess类中有数据变化");
}
}
苏克贝塔 2019-06-21
  • 打赏
  • 举报
回复
private void WorkThread()
{
while (true)
{
this.label1.BeginInvoke((MethodInvoker)delegate
{
label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
});
Thread.Sleep(500);
}
}

这是一种方法,而另一种方法,就是如你所想的那样,将后台和UI彻底解耦,可以在后台的数据处理类中(DataProcess)对外申明事件,如:OnDataChangeEvent(), 然后在UI中可以去监听此事件,也可以不监听此事件,随你意。(哦,在C#中叫订阅事件^^)
米色米香 2019-06-21
  • 打赏
  • 举报
回复
BackupGroundWorker,很简单就可以处理了
橘子皮... 2019-06-21
  • 打赏
  • 举报
回复
this.begininvoke.....
kee_ 2019-06-21
  • 打赏
  • 举报
回复
WF中用invoke,WPF中有专门的线程调度类Dispatcher
ysugstar 2019-06-21
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
用control.invoke委托
引用 5 楼 zy10240 的回复:
 //数据处理类
    public delegate void ListenerHandler();
    public class DataProcess
    {
        public event ListenerHandler OnDataChangeEvent = null;
        
        public DataProcess()
        {
            System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒;

            t.Elapsed += new System.Timers.ElapsedEventHandler(DoSomeThing);//到达时间的时候执行事件;
            t.AutoReset = true;
            t.Enabled = true;
        }
        public void DoSomeThing(object source, System.Timers.ElapsedEventArgs e)
        {
            if (OnDataChangeEvent != null)//确定事件已被订阅(注册过)
            {
                OnDataChangeEvent();//触发事件
            }
        }
    } 
 class Program
    {
        static void Main(string[] args)
        {
            DataProcess dd = new DataProcess();

            dd.OnDataChangeEvent += new ListenerHandler(ShowData);//订阅(注册)DataProcess类OnDataChangeEvent事件

            Console.ReadKey();
        }

        //事件处理方法
        private static void ShowData()
        {
            Console.WriteLine("DataProcess类中有数据变化");
        }
    }
在类中新开一个timer或新开一个线程可以么?
threenewbee 2019-06-20
  • 打赏
  • 举报
回复
用control.invoke委托
jx315425246 2019-06-20
  • 打赏
  • 举报
回复
很明确,除去委托,异步没有其他的方法,理新主介面UI
wid999 2019-06-20
  • 打赏
  • 举报
回复
你可以用System.Windows.Forms.Timer代替工作线程。
我想你可能把解耦理解岔了。异步处理和解耦、耦合不存在必然联系的。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧