读书人

延迟查询异步有关问题

发布时间: 2013-04-05 10:24:33 作者: rapoo

延迟查询异步问题


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

读书人网 >C#

热点推荐