1

簡単だと思ったことをやろうとしていますが、ステートメント関数内のラベルに書き込む方法がわかりません。

public static void StartProcessing(object data)
{

   lblError.Text = "Blah Blah"
}

「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です...」というエラーが表示されます。

そこで、ラベルの新しいインスタンスを作成して、それをコントロール (パネル) の新しいインスタンスに追加しようとしましたが、lblError が表示されません。

  public static void StartProcessing(object data)
    {
       Panel Panel1 = new Panel();
       Label lblError= new Label();
       Panel1.Controls.Add(lblError);

       lblError.Visible = true;
       lblError.Text = "Blah Blah";

    }

これを行う簡単な方法が必要ですか?私が見落としていたのは..

関数は次のように呼び出されます: 上記を静的でないように変更すると、下の 2 行目に同じ「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です... " この関数が静的でない場合は?

public object LaunchNewProcess(object data)
{
ThreadPool.QueueUserWorkItem(
                new WaitCallback(ProcessStatuses.StartProcessing),
                new object[] {newProcess, allProcesses}
                );
4

2 に答える 2

5

呼び出すときに静的関数にラベルを渡します。

public static void StartProcessing(object data, Label lblError)
{

   lblError.Text = "Blah Blah"
}

コントロールはページ (クラス)のインスタンスに属しているため、静的関数はコントロールにアクセスできません。

静的とは、クラスのすべてのインスタンスが同じ関数または変数を共有することを意味します。したがって、クラスのインスタンスは静的変数または関数にアクセスできます。ただし、静的はクラスのインスタンスを「認識」していないため、インスタンスのメンバーにアクセスできません。実際、静的メソッドまたは変数は、クラスのインスタンスが存在する必要さえありません。

static他の人が述べたように、関数からキーワードを削除しても機能しますが、何らかの理由で静的にしたと思います。

編集 さて、これはもっと複雑です。

一連のスレッドを起動するクラスがあり、何か問題が発生した場合にそれをユーザーに表示したいですか? ページのインスタンスがないとページのコントロールにアクセスできないため、現在のアプローチには欠陥があります。また、このアプローチがページのライフサイクルにどのように適合するかはわかりません。

あなたの最善のアプローチ(コードが不足していて申し訳ありません。実装に大きく依存します)は次のようになります。

//do this before you start spawning threads
List<bool> successes = new List<bool>();

ThreadPool.QueueUserWorkItem(
            new WaitCallback(ProcessStatuses.StartProcessing),
            new object[] {newProcess, allProcesses, successes}
            );

//you MUST wait for all your threads to complete before proceeding!
if(successes.Any(s => !s))
{
    //update your error label
}

public static void StartProcessing(object data, Label lblError)
{
    var dataArray = (object[3]) data;
    //if there is an error
    dataArray[2] = false;
}
于 2012-04-25T20:13:42.003 に答える
2

あなたがやりたいことは、実際にはかなり難しいです。

ページを作成し、非同期タスクを開始し、ページをユーザーに送信し、非同期ジョブが終了した後にページのコンテンツを更新したいと考えています。

問題は、非同期タスクが終了するまでにページが既に送信されており、応答を送信した後の HTTP の動作に基づいていることです。クライアントとのコミュニケーションはもう必要ありません。それらを更新したい場合は、クライアントが別のリクエストを送信するのを待つ必要があります。

これは、基本的に「もう終わりですか、もう終わりですか、もう終わりですか?」とサーバーを常にポーリングする JavaScript コードが必要であることを意味します。最終的にサーバーが「はい、ページに表示するものがあります」と言うまで。

幸いなことに、ゼロから始める必要はありません。 ここでは、これらすべてを行う Microsoft の例を示します。ニーズに合わせて変更できます。また、プログラミングが簡単ではないことに加えて、サーバーを常にポーリングするために多くのリソースを消費することにも注意してください。

オプション 2 は、新しいスレッドで他のタスクを開始せず、ページがユーザーに返される前にコードをシリアルに実行することです。彼らはしばらく空白の画面を見つめることになりますが、プログラミングははるかに簡単になります。ここで注目すべきダウンサイズの 1 つは、タスクが非常に長時間実行されている場合のタイムアウトです。

于 2012-04-25T20:40:42.503 に答える