将表单的上下文发送给其他类

时间:2017-07-22 16:39:45

标签: c#

嗨,我已经将表单上下文发送到另一个类来运行那里的函数,但是有趣的是显示消息框而不是更新表单文本,为什么?

  • 我需要函数start来更新表单标题
  • 我将表单上下文作为参数发送到计时器类
  • 函数在interval中开始工作,但方法无法更新 表格控制
  

这是表格类

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            //form constractor 
            InitializeComponent();
        }
        timer mytimer;
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void Elipse()
        { //the code for timer :) //yazeed coding  
            //MessageBox.Show(" ");
            this.Text=" jkghjg";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            mytimer = new timer();
            mytimer.elipse += Elipse;
            mytimer.Interval = 1000;
            mytimer.start(this);
        }
    }
}
  

这是计时器类

class timer
{
    bool isstart;
    public delegate void Del();
    public Del elipse;
    public static void UserRep() { }
    public bool Enable { get; set; }
    public int Interval { get; set; }
    public timer()
    {
        Enable = false;
        Interval = 1000;//default is 1 sec
        isstart = false;
        elipse = new Del(UserRep);
    }
    public void start(Form Context)
    {

         Context.BeginInvoke((MethodInvoker)async delegate
        {
            Enable = true;
            isstart = true;
            do
            {
                await Task.Delay(Interval);
                new Thread(() => 
               {
                   elipse(); //the replacment running now (interface thrad protected)
               }).Start();
            }
            while (isstart);
            Enable = false;
        });
    }
    public void stop()
    {
        isstart = false;
    }
}

并感谢

2 个答案:

答案 0 :(得分:1)

当你开始一个新线程时,你需要在Form上下文中调用elipse:

替换:

               new Thread(() =>
                {
                    elipse(); 
                }).Start();

                new Thread(() =>
                {
                    Context.BeginInvoke(elipse); 
                }).Start();

答案 1 :(得分:0)

感谢罗伯特,良好的改进,代码运行成功我添加帖子,看看别人怎么说,代码正确:)我保持这样的方法,让其他开发人员了解这一点他们可以在这里添加更多代码

  • 我发现他们使用长代码执行小任务的帖子很多, 这里是许多项目中使用的许多方法的轻量代码,并且很有帮助
  • 此代码与我实施的Microsoft计时器相同
  

这里是

any