0

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

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

2 回答 2

2

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

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

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

于 2013-08-23T15:54:01.303 回答
0

您正在启动线程,然后只检查下面的行是否还活着。

正如此属性告诉我们线程是否已启动 - 这是您代码中的竞争条件。有时它可能会起作用,有时不取决于线程调度程序是否超快地启动它。

我建议发布线程已从工作线程本身启动的通知。

如果您使用的是 .NET 4+,则可以使用任务并行库之类的东西,从而获得更好的代码。

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

于 2013-08-23T10:52:20.440 回答