Adventures in C# and Windowsland, part 2b – Threading/Event loops

I thought that my previous post needed a follow-up, after the whole discussion and what happened.

Before stepping on, I would like to thank everyone who commented and gave me some precious advices. I really appreciate it. Now, to the point.

I discovered (thanks to previous comments) the existance of BackgroundWorker, that I still didn’t understand if it’s part of Windows.Forms or not (belongs to System.ComponentModel namespace but somehow makes me feel it’s part of the Forms stuff). So I ditched my ExtendableThread and switched to it.

I liked the fact that you can report progress just by calling an event that reports a percentage. Pretty nice, especially for some basic usages, where it really saves you the hassle of reimplementing such small things on your own. Thumbs up to that. Solved the threading stuff, it was now time to make the threads talk one another. And here came the point where I needed to start messing with my own events.

Events have some points stronger than Qt’s Sig/Slots, and some points weaker. Let’s get through them.

Declaration: As any Qt developer might notice, declaring an event or a signal/slot connection takes exactly the same amount of code. To roll down my own event, it came up to this:


public delegate void ExchangeCompletedHandler(object source, Message reply);
[...]
public event ExchangeCompletedHandler ExchangeCompleted;
[...]
ExchangeCompleted(this, reply);

vs


Q_SIGNALS:
void ExchangeCompletedHandler(Message reply);
[...]
emit ExchangeCompleted(reply);

Ok, you actually see it takes one line less in Qt. Anyway, declaring a delegate is both a nice and a odd feature. The plus is that safety of connections is determined at compile time, and there’s no way in the world that a connection might fail at runtime (with Qt it can). On the other side, I like to do this sometimes:


connect(blah, SIGNAL(test(int,QString,QWhatever)), this, SLOT(plainTest()));

Not having a compile-time check lets you create dynamic connections that doesn’t force you to have the same parameters as the signal, but one of them, none, etc. In C# that would require declaring a delegate for each form of your “slot”. But in the end, I think the approach that C# takes can give some more assurance to the inexperienced programmer, so I guess they’re even.

Calling the “slot”: One other thing you might have noticed by comparing the 2 declarations is that the Qt one lacks a parameter. Or better not, you can retrieve the sender just by calling sender() inside the slot. Qt’s metaobject rocks definitely, and that’s something I miss in C#. This also made me wonder if I could fake the streamer when streaming an event in C#, since I have to declare this explicitely. I didn’t try, but I hope there is actually some way of checking this, otherwise it might lead to some unexpected results to the poor programmer.

So far so good, I think I’m quite satisfied with C# events. But then again failure struck me. I came to write that bunch of code:

IAsyncResult res = client.BeginConnect(serverBox.Text, Convert.ToInt16(portBox.Text),
new AsyncCallback(register_ConnectCallback), null);
}

private void register_ConnectCallback(IAsyncResult rs)
{
client.EndConnect(rs);
// Let's generate the XML request
RegistrationRequest req = RegistrationRequest.createRegistrationRequest(usernameBox.Text, passwordBox.Password);

So far so good, but my program wouldn’t work without telling me anything. After some weird try to see what was wrong, I tried debugging it, and I got stuck with an Exception that was not notified during the application run (very, very bad): “Can’t access Text since the object resides in another Thread”.

1 point more for throwing exceptions at this. It is actually nice that being non thread safe is considered an error at runtime, from my point of view. 1 less for not notifying me and not quitting the application and simply destroy the thread. 1 less since why on earth should I be in a different thread. Ok, nevermind that for now, and let’s try this hack:

Dictionary data = new Dictionary();
data.Add("username", usernameBox.Text);
data.Add("password", passwordBox.Password);

IAsyncResult res = client.BeginConnect(serverBox.Text, Convert.ToInt16(portBox.Text),
new AsyncCallback(register_ConnectCallback), data);
}

private void register_ConnectCallback(IAsyncResult rs)
{
client.EndConnect(rs);
// Let's generate the XML request
Dictionary data = (Dictionary)rs.AsyncState;
RegistrationRequest req = RegistrationRequest.createRegistrationRequest(data["username"], data["password"]);

Works, but it has a really bad shape. BeginConnect explicitely gives you the opportunity to pass some data in form of a generic object to retrieve it in the result. So this made me wonder if it was actually AsyncCall fault and it wouldn’t happen with events. I refactored the code to make the same function being an handler of an event that was streamed in the very same thread (I called Connect instead of BeginConnect and then streamed the event). Guess what? Same result.

This boils down to my very first concern about events: they’re belonging in a different thread, so thread safety goes to hell (it was definitely not the Timer, as you can see). The problem is, that hack does not suffice. I need to do this:


Storyboard cstory = (Storyboard)Resources["FeedbackAnimation"];
cstory.Begin();

To notify the user of the progress, and I obviously can’t. I’m stuck finding a way that will make me be able to do this without passing the Resources object to the thread (that, honestly, I don’t even think will work), also because I can’t overload my delegates with some parameters to pass the event custom data. I think there’s got to be a way, otherwise C# has somehow a big problem. The very first scope of using async methods in GUI applications is to have the gui responsive and give feedback to your user. What if the design of events prevents you from doing that?

For reference, Qt’s signals and slots are thread safe, and slots are delivered to each thread’s event loop, so that you are sure that your connection happens safely. You can even post events to the event loop of each thread in a completely thread safe way, if that’s not enough. I am fairly much missing that in C#, and I hope I can find a solution for this.

Spoiler on next post: Handling of data (XML and DataSource)

UPDATE: Found out about this.Dispatcher.Invoke(new Action(delegate() { cstory.Begin(); })); . Not very elegant and depends on WPF, but works. I’ll search for a better solution

~ by Dario on 15 April, 2009.

20 Responses to “Adventures in C# and Windowsland, part 2b – Threading/Event loops”

  1. ExchangeCompleted(this, reply);

    Be careful here – the event can be null if no-one has connected to it.

    The recommended way of calling it is:

    // this line is to prevent race conditions where the
    // last listener might be removed between the null
    // check and the call
    ExchangeCompletedHandler evt = ExchangeCompleted;
    if (evt != null)
    evt(this, reply);

    I can see why they did it this way (the null check allows for optimisations where you don’t calculate some value if no-one is going to use it), but it’s really annoying in the common case.

  2. Thanks for your hint, it saved my day!

  3. I don’t have ATT&T and i wanted an iphone, but getting one would be expensive. But i really love the apps and software. Then i realized the ipod touch is almost exactly the same! What are the specific differences between them? is the price the same?

    ________________
    unlock iphone 3gs

  4. Hi форумчане
    Поверить трудно , но случилось – женюсь!
    вот как Вы на это смотрите?

    з.ы. сорри если не туда написал, имоции🙂

  5. Каждому Привет! на Секс знакомства.

  6. Fire Extinghuishers respecting sales marathon: fire extinguishers

    Cannon Safety Ltd offer portable fire extinguishers, fire extinguisher hire and all fire safety requirements. Our comprehensive event fire safety and cover service covers all types of businesses nationwide.

  7. Мой сосед по этажу, которого я ну очень ”уважаю”, вздумал купить кухню. Чуть позже, предложив заглянуть и попить чаю, он позвал меня к себе. Когда я прошёл к нему в кухню, я увидел неописуемую красоту, при этом, такой кухни в москве я раньше не видел. Она заставила меня удивиться тому набору особенностей, что я считал самыми важными для любого кухонного набора – комфорт , стиль , удобство , простор . Естественно, я сразу же начинаю расспрашивать у него – сколько стоит, где продается и прочее. Однако же, его ЭГОистическое чувство жадности и зависти , которые замечал каждый, кто хоть раз с ним пообщается, перечёркивали все его хорошие качества. Разумеется, о покупке своей он мне ничего говорить не стал. Тщетными оказались мои уговоры, намёки на соседскую дружбу и типичную человеческую порядочность, на то, что давно живём по соседству – молчит проклятый. А обосновал он это ещё более оригинально, говорит: я всегда хотел иметь что-то такое, чего ни у кого другого не будет. Я поржал с его идиотской мечты, плюнул на этого дебила и ушёл.

    Сам я завистливым никогда не был. Мы с моей женой всё никак не могли найти ничего стоящего, хотя желание поставить в дом новенькую мебель для кухни возникло у нас уже довольно давно. Уверен, что все превосходно знают о том, что у нас не очень просторные квартиры. Кухня очень небольшая, даже вдвоём повернуться тесновато. А хочется, чтобы и красиво было , и стильно , и уютно . Я своей благоверной намекнул, что был у соседа нашего и видел там красоту, но он зараза молчит и не хочет рассказывать, где нашёл.

    Но вот один раз, шарюсь я по сети и вижу любопытное фото – на нём точно такая же кухня. У меня глаза ярче огня, пасть шире бездны. Я тут же хватаю телефон, звоню, спрашиваю – это тут делают кухни на заказ? Проходит пара недель, и новинка стоит в кухне как будто она там всегда стояла. Иду за тем мудаком из квартиры, что рядом. Он чуть не сдох от зависти. На его лице был гнев всех садистов и всех евреев на земле. О чём он там думал, я понятия не имею, но свалил он, не сказав ни слова.

    ”Холодная” война между нами не прекращается до сих пор, хоть с тех пор прошло уже очень много времени. И главное из-за чего война? Из-за кухни, кошмар. Вот только война между нами односторонняя получается, аж странно. Он меня похоронить готов, когда видит в подъезде, хотя у меня к нему, вообще, никаких претензий нету. Зная его заскоки, даже машину стараюсь под его окном не оставлять, а то мало ли. ))

    Теперь я занят поисками уже нового гарнитура для кухни. Я уже побаиваюсь – вдруг ещё раз у нас окажутся аналогичные кухонные гарнитуры! Тогда, выходя из наших квартир в одно время, вместо пожатия рук мы будем устраивать гладиаторские бои. Мечтаю прибрести кухонный наборчик под заказ, дабы было меньше вероятности совпадения.)) Сейчас есть повод мозг напрячь. Главное, чтобы у него такой же не было.

  8. Смотреть порно видео. Смотреть порно видео онлайн.

  9. Только для спортсменов – Порно ролики. Без посредников продать и купить.

  10. Объявления, курсы, обучение – http://rusfucksite.com/smotret-pornoponline-besplatno.htmlсмотреть порно бесплатно. Игра Паранормальное Агентство.

  11. Hello people!

    I would like to to tell you off a awesome new IT forum.
    I really hope it might be usfull for many people around here.

    Here it is:
    IT Helper

  12. ЛКЫРЕТКЕС

  13. Кино онлайн

  14. Медведев освободил от должности 10 генералов МВД
    Давно пора увольнять , ато зажрались там!

  15. Спасибо за интересную статью!🙂

  16. Наращивание ногтей, гель (на формы и на типсы), френч
    г. Москва, м.Отрадное, м. Бабушкинская
    +7 (926)541-54-42 – (ЕЛЕНА)

  17. Way back in 2003, before she was famous, she was just another girl on the party scene in LA, and best friends with Paris Hilton. She was dating a rapper named Ray J at the time and the two headed off for Mexico and filmed what would become one of the most downloaded videos the internet has ever seen…
    Dubbed Kim K Superstar, the 39 minute DVD was released in 2007 after Porn purveyor Vivid bought the rights and settled with Kardashian for $5 million dollars and immediately began selling the footage. The DVD sold over 1 million copies.
    Now, in a new twist, Vivid has released all of their Kim K sex tape footage… and it’s even more uncensored and longer than we imagined.
    Dubbed “Kim K Superstar, Part 2” the full online version is over 1 hour 40 minutes long.

  18. Увидела Недавно свою подружку-толстушку, и была в шоке, что она
    теперь подружка-стройняшка!!!, она очень торопилась я лишь успела ей восхититься.
    И спросить как??? она ответила, что диета Синовур ей помогла. Ищу ищу в инете
    который день.. Может не правильно расслышала? Помогите найти.
    Я конечно понимаю, что гугл мне в помощь… но(.

  19. I like the valuable information you provide in your articles.
    I will bookmark your blog and check again here regularly.
    I’m quite certain I’ll learn a lot of new stuff right here!
    Best of luck for the next!

  20. , .
    http://moneyint.ru/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: