【问题标题】:Timer control not working in ASP.net计时器控件在 ASP.net 中不起作用
【发布时间】:2011-07-28 09:03:41
【问题描述】:

我有这样的情况。

  1. TestClass - UI 层中定义的类
  2. test - 类级变量
  3. 提交按钮调用一个函数DoSomeThing()..它在业务层执行一些操作不断更新类的状态属性
  4. Timercontrol 获取状态(来自同一变量测试)以显示在 UI 中

提交按钮由一个线程(比如线程 1)运行并开始操作。是这个线程从 BL 更新状态属性

Timer 控件每次都会创建一个新线程来运行 TimerEvent(比如线程 2、3 等)。

这里的问题是 test.Status 由 thread1 更新的属性不可被其他线程访问。它始终为 null ,即使该属性已由线程 1 更新..

解决办法是什么? 提前致谢

public class TestClass                   //---->#1
{   
    private test = new Test() ;       //---->#2          

    protected void SubmitButon_Click(object sender, EventArgs e)
    {             
      //  This is performed by Thread1
      test.DoSomeThing()             //------>#3
    }   

    protected void UpdateTimer_Tick(object sender, EventArgs e)
    {
      // Timer controls sends out a new thread each time
      Label1.Text =  test.Status;           //------>#4
    }   
}

【问题讨论】:

  • 使状态属性静态(Test.Status)实际上达到了目的..但我想知道为什么它不适用于实例变量..

标签: c# .net asp.net multithreading timer


【解决方案1】:

这里是使用委托和更新来自不同线程的 UI 元素的示例

    delegate string CallFunctionDelegate(string arg1, string arg2);

    private void btnStart_Click(object sender, EventArgs e)
    {
        CallFunctionDelegate delegRunApps = new CallFunctionDelegate(DoSomeThingBig);

        AsyncCallback CallBackAfterAsynOperation = new AsyncCallback(AfterDoingSomethingBig);

        delegRunApps.BeginInvoke("", "", CallBackAfterAsynOperation, null);
    }

    private string DoSomeThingBig(string arg1, string arg2)
    {
        #region Implemetation of time consuming function
        //Implemetation of time consuming function

        for (int i = 0; i < 5; i++)
        {
            Thread.Sleep(1000);

            if (btnStart.InvokeRequired)
            {
                btnStart.Invoke((new MethodInvoker(delegate { btnStart.Text = i.ToString(); })));
            }
            else
            {
                btnStart.Text = i.ToString();
            }
        } 
        #endregion

        return arg1.Replace("freetime", arg2);
    }

    private void AfterDoingSomethingBig(IAsyncResult result)
    {
        MessageBox.Show("Finaly Done!! ;) ");

        btnStart.Invoke((new MethodInvoker(delegate { btnStart.Text = "Start"; })));
    }

【讨论】:

    【解决方案2】:

    问题发生是因为每次执行第 2 行后,timerthread 都会创建一个新实例。因此 test.Status 始终为空。这就是问题的原因

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多