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

时间:2013-08-23 10:43:16

标签: c# asp.net multithreading

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

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 */);
    }
} 

2 个答案:

答案 0 :(得分:2)

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

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

最后,您通常不希望在ASP.Net中显式分配新线程。如果您使用ThreadPool

,那么在负载下您将获得更好的整体性能

答案 1 :(得分:0)

您正在启动该主题,然后只是检查它是否还活着。

由于this property告诉我们线程是否已经启动 - 它是代码中的竞争条件。有时它可能会工作,有时不依赖于线程调度程序是否超级快速启动它。

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

如果您使用的是.NET 4+,则可以使用类似任务并行库的内容,以获得更好的代码。

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