首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

延迟查询异步有关问题

2013-04-05 
延迟查询异步问题private void Form1_Load(object sender, EventArgs e){}private void textBox1_TextChan

延迟查询异步问题


  private void Form1_Load(object sender, EventArgs e)
        {
           
        }
       
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            //这里加一个300秒的延迟避免频繁查询的问题
            //但是有一个问题  this.label1.Text的上的文字延迟了
            //this.textBox1.Text这个也延迟(这个不是我想要的)
            // 在this.textBox1.Text 快速输入 123456 但是在this.textBox1.Text上有明显的延迟 这不是我们想要的
            System.Threading.Thread.Sleep(300);
            this.label1.Text = this.textBox1.Text;//这个地方将来要换成查询数据库的操作逻辑代码

            // 应该this.label1.Text 整个显示是延迟的 this.textBox1.Text显示是同步的 需要用到线程的一部调用吗?怎么实现?
        }

[解决办法]
放在线程里来延迟查询,不影响ui的赋值

[解决办法]
上面代码又不是在线程里
你用多线程,在多线程里延迟查询
或者你像2楼说的用timer定时器
[解决办法]
线程我指的是你在单独弄个多线程,不是ui线程
[解决办法]

 Timer timer = new Timer();
        public Form1()
        {
            InitializeComponent();
            timer.Interval = TimeSpan.FromMilliseconds(300);
            timer.Tick += timer_Tick;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            timer.Stop();
            this.label1.Text = this.textBox1.Text;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            timer.Start();
        }

[解决办法]
    public delegate void DelayHanddler();
        public Form1()
        {
            InitializeComponent();
              }



      

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            new System.Threading.Thread(new System.Threading.ThreadStart(myThread)).Start();
        }

        public void myThread()
        { 
               DelayHanddler dh=new DelayHanddler(Delay);
               this.BeginInvoke(dh);
        }
        private void Delay()
       {
           Thread.Sleep(300);
          this.label1.Text = this.textBox1.Text;
      }
           

 
[解决办法]
        
public static void DoWork(SendOrPostCallback task, object state = null, int millisecond = 1000)
{
    new Action<SynchronizationContext, SendOrPostCallback, object, int>(DoWorkAsync).BeginInvoke(SynchronizationContext.Current, task, state, millisecond, null, null);
}

static void DoWorkAsync(SynchronizationContext context, SendOrPostCallback task, object state, int millisecond)
{
    System.Threading.Thread.Sleep(millisecond);//等待原有线程刷新完毕
    context.Post(task, state);
}


调用:

void textBox1Tolabel1(object state)
{
    this.label1.Text = this.textBox1.Text;
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    DoWork(textBox1Tolabel1);
}

[解决办法]
引用:
引用:C# code?123456789101112131415161718192021222324    public delegate void DelayHanddler();        public Form1()        {            InitializeComponent();              ……

改一下

  private void Delay()       
{         
  Thread.Sleep(300);          
this.label1.Text = this.textBox1.Text;     
Application.DoEvents();
 }          
[解决办法]
引用:
引用:C# code?1234567891011         public static void DoWork(SendOrPostCallback task, object state = null, int millisecond = 1000){    new Action<SynchronizationContext, Sen……


.net 2.0下面也没关系,只不过不支持默认值和匿名委托,这2个都是为了方便而用,不是必须的,都可以模拟出来。
[解决办法]
这是.NET2.0的版本:

#region 事件延迟触发
public static delegate void DoWorkAsyncDelegate(SynchronizationContext context, SendOrPostCallback task, object state, int millisecond);

public static void DoWork(SendOrPostCallback task, object state, int millisecond)
{
    new DoWorkAsyncDelegate(DoWorkAsync).BeginInvoke(DispatcherSynchronizationContext.Current, task, state, millisecond, null, null);
}

static void DoWorkAsync(SynchronizationContext context, SendOrPostCallback task, object state, int millisecond)
{
    System.Threading.Thread.Sleep(millisecond);
    context.Post(task, state);
}
#endregion

调用:
void textBox1Tolabel1(object state)
{
    this.label1.Text = this.textBox1.Text;
}
 
private void textBox1_TextChanged(object sender, EventArgs e)
{
    DoWork(textBox1Tolabel1,null,300);
}

[解决办法]
引用:
引用:引用:C# code?123456789101112131415161718192021222324    public delegate void DelayHanddler();        public Form1()        {            InitializeCo……

你概念不清啊,这样使用多线程和同步调用完全没区别,那个Thread.Sleep(300)是被控件所在线程同步执行的。
[解决办法]
我发你留言了,你没看?超过3次回帖不让我改了。
DispatcherSynchronizationContext改为SynchronizationContext

热点排行