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()Webページにメッセージを載せるだけです:

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

あなたのページが何をしているかを考えてみましょう。ブラウザのリクエストが届くと、新しいスレッドが開始され、完了するまでループします (ただし、確実ではありません - IsAliveh. alex が指摘したように、 の使用には競合状態があります)。ループが完了すると、データがブラウザーに送信され、アラート ボックスが表示されます。したがって、新しいスレッドを作成したとしても、並列処理は達成されていません。実際、最初のスレッドは でビジー待機してIsAliveいるため、作業を同期的に行った場合よりも実際にはパフォーマンスが低下します。

最初のページ リクエストを完了させ、ブラウザがサーバーに更新を要求するようにする必要があります。通常、更新を取得するために Web サービスに渡すことができるある種のトークンを返します。

最後に、通常、ASP.Net では新しいスレッドを明示的に割り当てたくありません。を使用すると、負荷がかかった状態で全体的なパフォーマンスが向上しますThreadPool

于 2013-08-23T15:54:01.303 に答える
0

スレッドを開始し、それが生きているかどうかを確認する以下の行だけです。

このプロパティは、スレッドが開始されたかどうかを示します。これは、コード内の競合状態です。スレッドスケジューラが非常に速く開始したかどうかに依存しない場合もあります。

スレッドがワーカー スレッド自体から開始されたという通知を投稿することをお勧めします。

.NET 4+ を使用している場合は、タスク並列ライブラリのようなものを使用して、より適切なコードを作成できます。

その後、継続として終了したという通知を受け取ることができます。それ以外の場合は、ワーカー スレッドからのコード行として通知を送信します。

于 2013-08-23T10:52:20.440 に答える