在线程结束时向ASP.NET发送消息

本文关键字:NET 消息 ASP 线程 结束 | 更新日期: 2023-09-27 18:28:41

我是多线程的新手,我正试图在线程结束时调用一个简单的警报按钮。这是我的密码。。。请告诉我这个有什么问题,因为它不起作用。

public static void RunUpload()
{
    Thread thread = new Thread(RunUploadOnThread);
    thread.Start();
    while(thread.IsAlive)
    {           
        Show("Rate upload in progress.");
    }
    Show("Rate upload completed.");
}

Show()只是在网页上发布消息:

public static void Show(string message)
{
    string cleanMessage = message.Replace("'", "''");
    Page page = HttpContext.Current.CurrentHandler as Page;
    string script = string.Format("alert('{0}');", cleanMessage);
    if (page != null &&
        !page.ClientScript.IsClientScriptBlockRegistered("alert"))
    {
        page.ClientScript.RegisterClientScriptBlock(
            page.GetType(), "alert", script, true /* addScriptTags */);
    }
} 

在线程结束时向ASP.NET发送消息

考虑一下您的页面正在做什么。当浏览器请求进入时,它会启动一个新线程并循环,直到它完成(但并不可靠——正如h.alex所指出的,IsAlive的使用有竞争条件)。循环完成后,它会将数据发送到浏览器,浏览器可以显示警报框。因此,即使您创建了一个新线程,也无法实现任何并行性。事实上,由于您的第一个线程正忙于等待IsAlive,因此它的性能实际上比您刚刚同步完成工作时更差。

您需要完成初始页面请求,并让浏览器向服务器请求更新。通常,您会返回某种令牌,这些令牌可以传递给web服务以获取更新。

最后,您通常不希望在ASP.Net中显式地分配新线程。在负载下,如果使用ThreadPool,您将获得更好的总体性能。

您正在启动线程,然后只启动下面的一行,检查它是否处于活动状态。

正如这个属性告诉我们线程是否已经启动一样,这是代码中的竞争条件。有时它可能会工作,有时则不取决于线程调度程序是否超快速启动它。

我建议发布一个通知,说明线程已经从工作线程本身启动。

如果你使用的是.NET4+,你可以使用类似任务并行库的东西,这样可以生成更好的代码。

然后,您可以将它完成的通知作为一个延续。否则,将通知作为工作线程的一行代码发布。