0

我目前正在编写一个小后台工作者,它在线程完成执行时调用“WorkerFinished”事件。但问题是,我显然无法更新此事件处理程序中的任何 UI 元素。线程完成后,我需要在主 ASP 页面中启用一些按钮。

所以,我知道我不能像这样直接做到这一点,但我对如何解决这个问题一无所知。

以下是相关代码:

public void Start(Dictionary<string, object> args)
{
   m_thread = new Thread(() =>
        {
            m_progress = 0;
            DoWork.Invoke(ref m_progress, ref m_result, args);
            m_progress= 100;

            m_isDone= true;
            if( FinishedWork != null )
                 FinishedWork.Invoke(ref m_result, args); // Here goes
        });
        m_thread .Name = m_name;
        m_thread .IsBackground = true;
        m_thread .Start();
}

因此,从此,我订阅了 ASP 页面上的FinishedWork事件,我需要再次启用“开始”按钮。

那么,有没有办法让我确保这个调用发生在 UI 线程上?

谢谢,奥文德。

4

1 回答 1

1

你不能。当您完成后台任务时,已经发送了对客户端的响应。没了。如果您尝试向客户端发送任何不是响应特定请求的信息,或者他们已经收到响应的请求,那么他们的防火墙肯定会阻止该传输。这与标准的网络模型完全相反。客户端发出请求,服务器发送响应,仅此而已。

该模型不是为客户端和服务器之间的双向通信而设计的,其中服务器可以随时向客户端发送数据。

确实存在支持这种双向通信的模型,但并非所有客户端都支持它。

另一种选择是让客户端不断地轮询服务器(可能是异步的)不断地询问它,“你完成了吗?”,“你完成了吗?”,“你完成了吗?” 这里的一般模型是异步任务将以全局状态的形式存储一些与它的进度有关的信息,以供将来的请求(即数据库、会话等)访问,并且来自客户端的频繁轮询请求将查看该状态. 这个模型的一个例子可以在这里看到。请注意,在网络上不断轮询服务器以获取更新是非常耗费资源的,因此请注意如何使用此模式。

于 2013-04-18T20:15:02.083 回答