需要帮助处理Web.UI中的InvokeRequired问题

3

我有一个多线程的C#应用程序,尝试向由另一个线程创建的Windows.Forms中的TextBox写入内容。

由于线程不能修改未被它们创建的内容,因此我使用下面代码中所示的InvokeRequired来解决这个问题。

public delegate void MessageDelegate(Communication message);
void agent_MessageReceived(Communication message)
{
   if (InvokeRequired)
   {
       BeginInvoke(new MessageDelegate(agent_MessageReceived), new object[] { message });
   }
   else
   {
      TextBox1.Text += message.Body;
   }
}

现在我需要对ASP.NET应用程序中的一个TextBox执行相同的操作,但显然Web.UI中的TextBox不支持InvokeRequired或BeginInvoke。我该怎么办?

2个回答

2

我认为在 Web UI 上不需要这个。每个客户端都会收到自己的文本框,而 Web 服务器不会把文本框用于多个请求。我是否有遗漏什么?


那么你的意思是,在Web.UI中,如果线程一创建了一个文本框,线程二可以直接修改它? - Ali
不,我的意思是在Web开发中,不存在两个线程同时修改同一个TextBox的情况。 - Ikaso
好的,我明白你的意思了,但我想知道的是,在Web应用程序中,一个线程能否直接修改另一个线程创建的控件,而不必在同一时间内进行操作,因为这在Windows应用程序中是不可能的。如果可以,该如何实现? - Ali
在 Windows 应用程序中,唯一能够修改 UI 的线程是 UI 线程,因为 UI 类不是线程安全的。也许这种情况可能发生在 Web 应用程序的客户端。但我不是客户端开发专家。 - Ikaso

1

如果你正在尝试做我认为的事情,那么这是不可能的。如果你的事件处理程序是由服务器上的某个后台进程调用的,那么你怎么可能更新文本框呢?你要更新哪个文本框?你要更新的文本框都在客户端的Web浏览器上,而不是你的服务器上。

无论如何,你的问题的答案是没有InvokeRequired或Invoke方法,因为在ASP.NET中,控件不能跨线程访问。只有当前处理Web请求的线程才能访问正在提供服务的页面的元素。

你需要重新考虑你的方法。你不能像桌面应用程序一样在Web应用程序中做事情。


谢谢,非常有帮助。我现在知道需要改变方法了。你有什么建议吗? - Ali
抱歉晚回复了,我没有注意到你的评论。如果你有一项长时间运行的操作,ASP.NET 中有一种可能的替代方案是使用异步页面处理。http://msdn.microsoft.com/en-us/magazine/cc163725.aspx 或者你可以使用类似 Ajax 轮询机制的东西。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接