Синхронизация
4 отговора
154 прегледа
Синхронизация
Имам клас(показан по-долу), който има един делегат и един метод. Значи въпроса ми е следния:
Какво точно трябва да направя за да изчаквам приключването на изпълнението на делегата. Използвам тая боза като за делегат закачам Update на една БД. Как да изчакам да приключи въпросния Update? нещо в декларацията на класа? нещо при викането на метода?
public class Worker
{
public Worker ()
{
}
public delegate void TimerPusherCallback ();
public TimerPusherCallback TimerEventHandler;
public void Push()
{
if (TimerEventHandler != null)
{
TimerEventHandler();
}
}
}
Ние сме точици във вселената. А всеки човек е една цяла вселена...
Какво точно трябва да направя за да изчаквам приключването на изпълнението на делегата. Използвам тая боза като за делегат закачам Update на една БД. Как да изчакам да приключи въпросния Update? нещо в декларацията на класа? нещо при викането на метода?
public class Worker
{
public Worker ()
{
}
public delegate void TimerPusherCallback ();
public TimerPusherCallback TimerEventHandler;
public void Push()
{
if (TimerEventHandler != null)
{
TimerEventHandler();
}
}
}
Ние сме точици във вселената. А всеки човек е една цяла вселена...
Re: Синхронизация
Извикването на делегата не е ли блокиращо? Няма ли да се изчака изпълнението на всички дето са се абонирали за него и тогава да се върне изпълнението при теб?
Възможно ли е Update() да ти прави проблем и да връща рано? Пробвай празен делегат със спане от няколко секунди за проверка.
--
Екстремно програмиране на български.
[линк]
Възможно ли е Update() да ти прави проблем и да връща рано? Пробвай празен делегат със спане от няколко секунди за проверка.
--
Екстремно програмиране на български.
[линк]
Re: Синхронизация
ако съм разбрал правилно въпроса ти ... ти искаш main thread-a ти да спре изпълнение докато second thread-a ти update-ва база данни ... това е лесно:
правиш си един Mutex примерно ... ама може и някъв друг синхронизационен обект:
Mutex mutex = new Mutex(false);
Update фунцията ти трябва да изглежда така:
void Update()
{
. . . mutex.WaitOne();
. . . // do the update
. . . mutex.ReleaseMutex();
}
а програмата ти трябва да изглежда така:
void main()
{
. . . // програмата прави нещо тука
. . .
. . . CreateThread( Do_Something_On_DB() ); // този тред ще работи с ДБ-то
. . .
. . . // програмата си прави нещо друго дето не е свързано с ъпдейта
. . .
. . . mutex.WaitOne(); // чакаш ъпдейта да свърши
. . .
. . . // код който трябва да се изпълни само след като свърши ъпдейта
}
това че имаш делегати няма връзка с това което се опитваш да направиш ...
ако нямаш тредове ... всичко се изпълнява синхронно ...
XM TurboCT .. where comfort meets power
правиш си един Mutex примерно ... ама може и някъв друг синхронизационен обект:
Mutex mutex = new Mutex(false);
Update фунцията ти трябва да изглежда така:
void Update()
{
. . . mutex.WaitOne();
. . . // do the update
. . . mutex.ReleaseMutex();
}
а програмата ти трябва да изглежда така:
void main()
{
. . . // програмата прави нещо тука
. . .
. . . CreateThread( Do_Something_On_DB() ); // този тред ще работи с ДБ-то
. . .
. . . // програмата си прави нещо друго дето не е свързано с ъпдейта
. . .
. . . mutex.WaitOne(); // чакаш ъпдейта да свърши
. . .
. . . // код който трябва да се изпълни само след като свърши ъпдейта
}
това че имаш делегати няма връзка с това което се опитваш да направиш ...
ако нямаш тредове ... всичко се изпълнява синхронно ...
XM TurboCT .. where comfort meets power
Re: Синхронизация
Друг възможен синтаксис:
If you don't care where you are going any road will get you there
public void update()
{ lock(this) //или това, което не искаш да се пипа едновременно от няколко нишки
{ правиш к'вото правиш и така
}
}
If you don't care where you are going any road will get you there