私は、別のスレッド(threadJobの子)上でジョブを(一度に1つずつ)起動することになるサービスを持っています。これらのジョブはかなりの時間がかかります。子スレッドはどのように親スレッドに状態/進捗状況を通知できますか?
は、私は彼らに報告する必要があります。
これまでそれほど頻繁に呼び出し側のアプリケーションがサービス(のGetStatus)からステータスを要求、これは何とかサービスは私の希望がでていることだった、仕事(子スレッド)が
であるかの時点で知っておく必要があることを意味しいくつかのマイルストーンは、子スレッドが状態の親スレッド(サービス)に何とか(SetStatus)通知することができ、サービスはその情報を呼び出し側アプリケーションに返すことができる。
ジョブが呼び出された()RunTaskを実行する必要があるので、
class Service
{
private Thread threadJob;
private int JOB_STATUS;
public Service()
{
JOB_STATUS = "IDLE";
}
public void RunTask()
{
threadJob = new Thread(new ThreadStart(PerformWork));
threadJob.IsBackground = true;
threadJob.Start();
}
public void PerformWork()
{
SetStatus("STARTING");
// do some work //
SetStatus("PHASE I");
// do some work //
SetStatus("PHASE II");
// do some work //
SetStatus("PHASE III");
// do some work //
SetStatus("FINISHED");
}
private void SetStatus(int status)
{
JOB_STATUS = status;
}
public string GetStatus()
{
return JOB_STATUS;
}
};
を、このスレッド(threadJob)を起動します: - たとえば
私はこのような何かを探していました。これはいくつかのステップを実行して実行します(SetStatusを使用して新しいステータスを
さまざまなポイントに設定します)。現在、(IPCを使用している呼び出し側アプリケーションから)要求されるたびにSTATUSを返す関数GetStatus()もあります。このステータスは、threadJobによって実行されているジョブの現在のステータスを反映する必要があります。
ThreadJob(または具体的にはPerformWork())がスレッドセーフな方法でステータスの変更をサービスする方法(SetStatus/GetStatusの上記の例は
unsafe)?イベントを使用する必要がありますか?私は単純にJOB_STATUSを直接変更することはできないと思う... ...もしもロックを使うべきであれば...?
サンプルがどのように動作するかは100%明確ではありませんSetStatusの呼び出し時にステータスが実際にどのように設定されているかは、スナップショット(ステータス)でのみ使用されますが、デリゲートJobStatusChangHandler また、どのようにのGetStatusは、この場合には動作しますか? – Shaitan00
呼び出し元は、まずJobStatusChangeイベントをサブスクライブする必要があります。スナップショット(ステータス)が呼び出されると、すべてのイベントハンドラが呼び出されます。 GetStatusを介してステータスをポーリングする代わりに、イベント駆動型メソッドを使用してステータスが変化するたびに、Serviceクラスが呼び出し元に通知します。 –
あなたのクラスをロックしようとする人が他にいないかどうかわからないので、lock(これ)を使用することに注意してください。これは完全に安全ではありませんが、それはデッドロックを招きます。 –