Мое приложение на C # таково, что фоновый работник используется для ожидания подтверждения некоторых переданных данных.Вот некоторый код psuedo, демонстрирующий то, что я пытаюсь сделать:
UI_thread
{
TransmitData()
{
// load data for tx
// fire off TX background worker
}
RxSerialData()
{
// if received data is ack, set ack received flag
}
}
TX_thread
{
// transmit data
// set ack wait timeout
// fire off ACK background worker
// wait for ACK background worker to complete
// evaluate status of ACK background worker as completed, failed, etc.
}
ACK_thread
{
// wait for ack received flag to be set
}
В результате тайм-аут ACK BackgroundWorker истекает, а подтверждение не принимается.Я вполне уверен, что оно передается удаленным устройством, потому что это устройство не изменилось вообще, и приложение C # передает.Я изменил ack-поток с этого (когда он работал) ...
for( i = 0; (i < waitTimeoutVar) && (!bAckRxd); i++ )
{
System.Threading.Thread.Sleep(1);
}
... на этот ...
DateTime dtThen = DateTime.Now();
DateTime dtNow;
TimeSpan stTime;
do
{
dtNow = DateTime.Now();
stTime = dtNow - dtThen;
}
while ( (stTime.TotalMilliseconds < waitTimeoutVar) && (!bAckRxd) );
Последний генерирует очень острое ожиданиевремя, по сравнению с первым.Однако мне интересно, мешает ли удаление функции Sleep возможности получать последовательные данные.Разрешает ли C # запускать только один поток за один раз, то есть нужно ли мне усыплять потоки в какое-то время, чтобы другие потоки могли работать?
Буду признателен за любые мысли или предложения, которые могут у вас возникнуть.Я использую Microsoft Visual C # 2008 Express Edition.Спасибо.