Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程结束时向ASP.NET发送消息_C#_Asp.net_Multithreading - Fatal编程技术网

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

C# 在线程结束时向ASP.NET发送消息,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我是多线程新手,我尝试在线程结束时调用一个简单的警报按钮。这是我的代码…请让我知道这是什么问题,因为它不工作 public static void RunUpload() { Thread thread = new Thread(RunUploadOnThread); thread.Start(); while(thread.IsAlive) { Show("Rate upload in progress."); }

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

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

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

As告诉我们线程是否已经启动——这是代码中的竞争条件。有时它可能工作,有时不取决于线程调度程序是否超快速启动它

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

如果您使用的是.NET4+,那么您可以使用类似于TaskParallelLibrary的东西,这样可以生成更好的代码


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

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

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


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

得到的错误是什么?
thread.Join()将等待线程完成(但也会阻止您的UI:)。我没有收到任何错误,我只想在警报中显示消息。