延迟查询异步问题

编程有钱人了 2013-04-03 03:15:40

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显示是同步的 需要用到线程的一部调用吗?怎么实现?
}
...全文
300 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
我发你留言了,你没看?超过3次回帖不让我改了。 DispatcherSynchronizationContext改为SynchronizationContext
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 16 楼 qldsrx 的回复:
这是.NET2.0的版本: C# code?1234567891011121314#region 事件延迟触发public static delegate void DoWorkAsyncDelegate(SynchronizationContext context, SendOrPostCallback task, object state, int millisec……
当前上下文中不存在名称“DispatcherSynchronizationContext”
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
引用 13 楼 gxingmin 的回复:
引用 11 楼 wangjun8868 的回复:引用 9 楼 gxingmin 的回复:C# code?123456789101112131415161718192021222324 public delegate void DelayHanddler(); public Form1() { InitializeCo……
你概念不清啊,这样使用多线程和同步调用完全没区别,那个Thread.Sleep(300)是被控件所在线程同步执行的。
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
这是.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);
}
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
引用 12 楼 wangjun8868 的回复:
引用 10 楼 qldsrx 的回复:C# code?1234567891011 public static void DoWork(SendOrPostCallback task, object state = null, int millisecond = 1000){ new Action<SynchronizationContext, Sen……
.net 2.0下面也没关系,只不过不支持默认值和匿名委托,这2个都是为了方便而用,不是必须的,都可以模拟出来。
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
难道只有定时器才好使??
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
引用 11 楼 wangjun8868 的回复:
引用 9 楼 gxingmin 的回复:C# code?123456789101112131415161718192021222324 public delegate void DelayHanddler(); public Form1() { InitializeComponent(); ……
改一下 private void Delay() { Thread.Sleep(300); this.label1.Text = this.textBox1.Text; Application.DoEvents(); }
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 10 楼 qldsrx 的回复:
C# code?1234567891011 public static void DoWork(SendOrPostCallback task, object state = null, int millisecond = 1000){ new Action<SynchronizationContext, SendOrPostCallback, ob……
.NET 2.0有什么好的方案吗?这貌似是4.0中的吧
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 9 楼 gxingmin 的回复:
C# code?123456789101112131415161718192021222324 public delegate void DelayHanddler(); public Form1() { InitializeComponent(); } pr……
this.textBox1.Text 输入过程中还是卡界面 延迟500毫秒更明显
qldsrx 2013-04-03
  • 打赏
  • 举报
回复
        
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);
}
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
    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;
      }
           
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 7 楼 NianHui 的回复:
C# code?123456789101112131415161718 Timer timer = new Timer(); public Form1() { InitializeComponent(); timer.Interval = TimeSpan.FromMilliseconds(300);……
上面的那段代码好使 我试了 先谢了 如果不用定时器 用线程怎么写?
#blackheart 2013-04-03
  • 打赏
  • 举报
回复

 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();
        }
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 4 楼 gxingmin 的回复:
上面代码又不是在线程里 你用多线程,在多线程里延迟查询 或者你像2楼说的用timer定时器
怎么写?
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
线程我指的是你在单独弄个多线程,不是ui线程
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
上面代码又不是在线程里 你用多线程,在多线程里延迟查询 或者你像2楼说的用timer定时器
编程有钱人了 2013-04-03
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
放在线程里来延迟查询,不影响ui的赋值
你可以试试上面的代码 就知道了
#blackheart 2013-04-03
  • 打赏
  • 举报
回复
用定时器吧。。
gxingmin 2013-04-03
  • 打赏
  • 举报
回复
放在线程里来延迟查询,不影响ui的赋值

110,533

社区成员

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

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

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