|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
Тема
|
c# - превръщане на асинхронен метод в синхронен
|
|
Автор |
Pekoнcтpykтop (дарвинист) |
Публикувано | 04.04.13 19:52 |
|
Как беше форматирането за код да ви пусна едно въпросче
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхроне
[re: Pekoнcтpykтop]
|
|
Автор |
zaphod (мракобес) |
Публикувано | 04.04.13 19:59 |
|
май беше с pre
sdfsdf
NE SUTOR ULTRA CREPIDAM
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхронен
[re: Pekoнcтpykтop]
|
|
Автор |
Aaron (charming) |
Публикувано | 04.04.13 21:32 |
|
Пускай въпроса, че с тая тема превръщане на асинхронен метод в синхронен не ти се разбира кво искаш да кажеш.
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхронен
[re: Pekoнcтpykтop]
|
|
Автор |
chupac (chupacabron) |
Публикувано | 04.04.13 22:00 |
|
айде пускай го, че и тая тема ще отече в мерене на пишки.
Al: [to some kids] Who wants to hear about the red-haired Grinch that stole Uncle Al\'s life?
| |
|
Не трябваха ли перманентни магнити?
| |
|
Добре, няма да рафинирам нещата до няква теоретична постановка, направо ви пляскам кода от проекта.
public bool GetUserSubscribeMethod(User user)
{
if (user == null)
throw new ArgumentException(ContractConstants.QelloService.BILLING_USER_STATUS);
bool result = false;
string req_params = "token=" + user.Token.AccessToken;
AutoResetEvent eventCompleted = new AutoResetEvent(false);
Thread thread = new Thread(start =>
{
PostJsonRequest<UserSubscribeStatus>(ContractConstants.QelloService.BILLING_USER_STATUS, req_params, response =>
{
if ((response.Error == null) && (response.Data != null))
{
result = true;
if ((response.Data.ActiveRecurring != null) &&
(response.Data.ActiveRecurring.Length > 0))
{
user.PaymentMethod = response.Data.ActiveRecurring[0].Trim();
user.SubscribeStatus.IsSubscribed = user.PaymentMethod != "";
}
}
eventCompleted.Set();
});
});
thread.Start();
eventCompleted.WaitOne();
return result;
}
PostJsonRequest, както може да се досетите, е асинхронен метод на базовия клас, който вика делегат, когато приключи. Обаче изникна случай, в който трябва задължително да се изчака резултат, защото програмата не може да работи без данните от заявката. Проблема, който възникна е, че WaitOne блокира thread, което не знам как точно и защо става. Съответно eventCompleted.Set() никога не се изпълнява и програмата зависва.
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхронен
[re: Pekoнcтpykтop]
|
|
Автор |
Aaron (charming) |
Публикувано | 05.04.13 13:53 |
|
PostJsonRequest, както може да се досетите, е асинхронен метод на базовия клас, който вика делегат, когато приключи.
И най-вероятно този делегат се вика в main thread-a, който пък от своя страна вече е заключен от eventCompleted.WaitOne() и чака сигнал?
Как очакваш въобще да се изпълни eventCompleted.Set() :-)
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхронен
[re: Aaron]
|
|
Автор |
Pekoнcтpykтop (дарвинист) |
Публикувано | 05.04.13 14:30 |
|
Очевидно е, че делегата е дефиниран на място.
| |
Тема
|
Re: c# - превръщане на асинхронен метод в синхронен
[re: Pekoнcтpykтop]
|
|
Автор |
Aaron (charming) |
Публикувано | 05.04.13 15:16 |
|
Ами това си е класически дедлок според мен.
1. стартира се тред от мейн треда
2. мейн треда се локва и чака сигнал от стартирания тред.
3. стартирания тред се опитва да изпълни код от мейн треда, който е заключен.
Изкоментирай това: result = true; и пробвай пак.
Като цяло за да го тестваш може да сложиш 15 сек. в WaitOne и виж дали след 15сек. ще се отключи.
| |
|
thread.Join() няма ли да промени нещо вместо евента?
| |
|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
|
|
|