2017-06-08 7 views
0

同じ機能を別の時間に実行する必要があるオブジェクトがいくつかあります。それらの一部のオブジェクトは相互排他的であり、一部は相互排他的ではありません。異なるオブジェクトで2つのタイマーをロックする

ので、短くするために、私は2つだけのタイマー

これら二つのタイマーが並列に動作するかを、この短い例を示していますか?あるいは私は別のアプローチをとるべきですか?

class MyTimer:Timer 
{ 
    private static int count=0; 
    public int Id {get; private set;} 
    public MyTimer(){ Id= count++;} 
} 

... 
object[] lockers = new object[2]{new object(), new object()}; 
MyTimer[] timers = new MyTimer[2]{ new MyTimer(), new MyTimer()}; 
... 
/* somewhere */ 
timers[0].Elapsed += Time_Elapsed; 
timers[1].Elapsed += Time_Elapsed; 
timers[0].Start(); 
timers[1].Start(); 
... 
private void Time_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    MyTimer timer = sender as MyTimer; 
    lock(lockers[timer.Id]) 
    { 
     /* part of code depends on timer.Id*/ 
    } 
} 

Kennyzxの答えAFTER EDIT(私はあまりにも多くのコードを書きたくありませんでしたが、私は、私は聞いて何を望むかについての上明確ではありませんでした):

interface IWorker 
    { 
    void DoSomething(); 
    } 
class MyTimer:Timer 
{ 
    public int Id {get; private set;} 
    public IWorker Worker; 
    public MyTimer(int id){ Id=id;} 
} 
... 
object[] lockers = new object[2]{new object(), new object()}; 
MyTimer[] timers = new MyTimer[3]{ new MyTimer(0), new MyTimer(1),new MyTimer(1)}; 
... 
/* somewhere */ 
timers[0].Elapsed += Time_Elapsed; 
timers[1].Elapsed += Time_Elapsed; 
timers[2].Elapsed += Time_Elapsed; 

timers[0].Worker = Worker_A; // implement IWorker 
timers[1].Worker = Worker_B; // implement IWorker 
timers[2].Worker = Worker_C; // implement IWorker 
timers[0].Start(); timers[1].Start(); timers[2].Start(); 
... 
private void Time_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    MyTimer timer = sender as MyTimer; 
    lock(lockers[timer.Id]) 
    { 
     timer.Worker.DoSomething(); 
    } 
} 

この新しい例でWorker_BとWorker_Cが相互にありますexlusive(timer.Idは同じなので)。しかし、Worker_Aはそれらと並行して動作することができます。 それを達成する正しい方法ですか?

答えて

0

は、これら二つのタイマーがパラレルに対応していますか?でSystem.Timers.Timerについては

を、Elapsedイベントがハンドラがparellel上で実行できるイベントを意味ThreadPoolのスレッド上で発生します。

しかし、あなたのlock文は、相互に排他的な保証することができますどのように、どういうわけか問題がありますか?オブジェクトの同じインスタンスをロックする必要があります。

object locker = new object(); 

... 

private void Time_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock(locker) 
    { 
     ... 
+0

詳細を追加して質問を更新しました。 – Ozzy

+2

あなたはコード作業をしていますが、クラスはOOの観点からうまく設計されていません。具体的には、MyTimerのIdプロパティとロッカー配列は同期の目的を果たしますが、相互排他的にアクセスする必要がある実際のリソースには直接関係しません。 StackExchangeにコードレビューのための[サイト](https://codereview.stackexchange.com/)があります。そこにコードを投稿し、コードを改善する助けを求めることができます。 – kennyzx

関連する問題