C# 异步文本框中的内容
我想在文本框中异步显示内容?有人知道我下面列出的代码的错误吗?我想实现文本框中的文本每秒将更新新值?我还想问为什么每次调用控制器的invoke方法之前都要检查invokererequiredC# 异步文本框中的内容,c#,C#,我想在文本框中异步显示内容?有人知道我下面列出的代码的错误吗?我想实现文本框中的文本每秒将更新新值?我还想问为什么每次调用控制器的invoke方法之前都要检查invokererequired private void Counting(int Num) { int i = 0; string counter = null; while (i < Num) { Thread.Sl
private void Counting(int Num)
{
int i = 0;
string counter = null;
while (i < Num)
{
Thread.Sleep(1000);
counter = string.Format(" {0}", i);
tbxStatus.BeginInvoke(new UpdateStatusDelegate(UpdateStatus), new string[] { counter });
}
}
public void UpdateStatus(string data)
{
tbxStatus.Text += data;
}
public delegate void UpdateStatusDelegate(string data);
public delegate void CountDelegate(int num);
private void btnStart_Click(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(new CountDelegate(Counting), new object[] { 5 });
}
else
Counting(5);
}
private void Counting(int Num)
{
int i=0;
字符串计数器=null;
while(i
谢谢您的
调用所需的
测试应该在代理中:
public void UpdateStatus(string data)
{
if (this.tbxStatus.InvokeRequired)
{
UpdateStatusDelegate d = new UpdateStatusDelegate(UpdateStatus);
this.Invoke(d, new object[] { data });
}
else
{
this.tbxStatus.Text = data;
}
}
如果使用以下扩展方法,还可以使其更简单、更清晰:
public static TResult SafeInvoke(this T isi, Func call) where T : ISynchronizeInvoke
{
if (isi.InvokeRequired) {
IAsyncResult result = isi.BeginInvoke(call, new object[] { isi });
object endResult = isi.EndInvoke(result); return (TResult)endResult;
}
else
return call(isi);
}
public static void SafeInvoke(this T isi, Action call) where T : ISynchronizeInvoke
{
if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi });
else
call(isi);
}
因此,如果我想调用我在UI线程中定义的方法(如表单实例中定义的方法),您可以使用以下代码(无需创建任何委托或其他内容):
在您的情况下,您可以执行以下操作:
formInstance.SafeInvoke(f => f.UpdateStatus(myCounterInt.toString));
或者类似的
我已经写过关于使用此功能的文章,但不要像我写的那样给我荣誉,因为我最近遇到了类似的问题 我正在编写一个网络游戏,我想将文本附加到我拥有的文本框中,但是我会得到一个错误,说我试图从另一个线程更改windows窗体控件,从而导致线程不安全。这是因为我在服务器端使用ASyncCallback 我以前有过这样的例子:(console方法是一个简单的方法,它获取一个字符串并将其附加到textbox) 为了解决这个问题,我不得不把它改成现在解决这个问题:
this.Invoke((MethodInvoker)delegate { console("message"); });
希望这能帮助其他遇到这个问题的人。这可能不是最好的办法,但对我来说确实是个好办法
问候
console("message");
this.Invoke((MethodInvoker)delegate { console("message"); });