Looking forward to your implementation.
I'm out of ideas!

Cheers
John






________________________________
From: Krzysztof Kozmic <[email protected]>
To: [email protected]
Sent: Thursday, 7 May, 2009 7:28:47 PM
Subject: Re: WCF Facility - Client proxy async calls

 
John,
 
See, here's the catch - you don't get the Begin/End methods (unless you do 
codegen, see my response to Valeriu) until the runtime.
So the goal is to emulate them in a most natural way.
 
There's a way to compile code that calls non-existing methods with the dynamic 
keyword in C# 4.0. then it would be possible, and I think we will do just what 
you proposed when we move to c# 4.0.
 
For now though, I'd like to find something that works in C# 3.0 or even C# 2.0 
if feasable.
 
Krzysztof

>>> [email protected] 2009-05-07 11:20 >>>

Yes this now makes sense :)

In my opinion if you want to make your API easy and natural I would stick to 
the asynchronous design pattern used in the .NET Framework (BeginXXX, EndXXXX) 
because this is what users are used to.

Here is what I'm thinking (no idea if this is possible or it would work!):

public class MyClient{

    private IAsyncProxy<IMyWcfService> asyncProxy;

    public MyClient(IAsyncProxy<IMyWcfService> asyncProxy){ //IoC would do its 
job here
        this.asyncProxy = asyncProxy;
    }

    public void DoIt(){
        AsyncCallback callback = new AsyncCallback(
            ar => asyncProxy.EndGetSize(ar)
        );
        IAsyncResult result = asyncProxy.BeginGetSize(line, callback);   
    }
}

The IAsyncProxy wrapper proxy would have to generate BeginXXX and EndXXX for 
the IService. I'm not sure if this is possible to do with DP2 ?
Anyway this is just my opinion, and there is possible other factors that I'm 
not seeing.

Cheers
John





________________________________
 From: Krzysztof Kozmic <[email protected]>
To: [email protected]
Sent: Thursday, 7 May, 2009 5:53:12 PM
Subject: Re: WCF Facility - Client proxy async calls


Oh now I see.
 
Well, there is nothing that stops you from doing that with WCF now.
However, that's not what i'm trying to achieve.
 
If you do it that way here's simplified model of what happens under the covers:
 
- you fire up the request on a thread pool thread.
- on that thread wcf serializes the messsage packs it up queues it its to-send 
queue
- then WCF blocks that thread waiting for the response
- on its own worker thread WCF then pushes the request to the server
- when the response comes back (or on timeout). WCF unblocks the thread and 
let's it chew up the response message (or timeout exception)
 
As you see this is not the most efficient. Basically what's wrong about this 
approach is that network request is an IO bound operation, not CPU bound 
operation, and doing it this way, is very inefficient.
 
the whole point of my code is to use WCF built in facility to perform network 
calls asyncronousely, which works basically like this:
 
- you fire up a request on BeginFoo method
- on your thread wcf serializes the messsage packs it up queues it its to-send 
queue and returns
- on its own worker thread WCF then pushes the request to the server
- when the response comes back (or on timeout) WCF runs on yet another thread 
the AsyncCallback method you provided as second to last parameter of BeginFoo 
method and let's it chew up the response message (or timeout exception)
 
As you hopefully can see this second model is much more efficient, but 
unfortunatelly you need the BeginFoo EndFoo methods to use it.
Ok, as I prooved you don't need them phisically, but WCF must think you have 
them. Now the whole point of this syntax debate is to try to find easy and 
natural syntax to change the following set of inputs and outputs:
 
[string] - [int]
 
into 
 
[string, AsyncCallback, System.Object] - [nothing]
plus
[IAsyncResult] - [int]
 
I hope that's clearer now.
 
Krzysztof

>>> [email protected] 2009-05-07 09:32 >>>

Sorry Krzystof, maybe this example explains my thinking:

public static void ExecuteWcfAsync<TChannel>(Action<TChannel> proxy) where 
TChannel : class
{
    TChannel generatedProxy = container.Resolve<TChannel>(); //Need to use IoC 
here to get the TChannel from container
    ThreadPool.QueueUserWorkItem(state => proxy.Invoke(generatedProxy));
}

The idea is to actually do the async bits inside the ExecuteWcfAsync method.
And if you don't want to use the .Net Thread Pool you can write your own 
threading.





________________________________
 From: Krzysztof Ko mic <[email protected]>
To: [email protected]
Sent: Thursday, 7 May, 2009 4:02:20 PM
Subject: Re: WCF Facility - Client proxy async calls

John,

Are you familiar with how async pattern works?
What you suggested looks great except that it won't work.
The GetSize syncronous method can't be used to return a value, because to do 
that it'd have to execute syncronousely, rendering the whole effort useless.
Since it can't return IAsyncResult as it should, because it would cause a 
runtime error, it retuns null (or 0 for value types).
The point is to somehow make up for the absence of actual methods:

IAsyncResult BeginGetSize(string line, AsyncCallback callback, object someData);
int EndResult(IAsyncResult);

Code similar to your could work if you used Expression classes, but I'm 
resisting using them unless I have to.

I appreciate your help, if you want ping me and I'll send you the actual code. 
I'm not going to publish it yet, since it's lacking a lot a the moment, but it 
is working and if anyone else wants to play with it, just drop me a line.
Krzysztof

John Simons pisze: 
I'm not very keen on all those casts.
And it doesn't seem natural to call proxy.GetSize(line); and not assign the 
result to anything!

Have a look at http://paste2.org/p/199716

Cheers
John






________________________________
 From: Krzysztof Ko mic <[email protected]>
To: [email protected]; [email protected]
Sent: Thursday, 7 May, 2009 5:47:22 AM
Subject: WCF Facility - Client proxy async calls


I'm working on adding to WCF Facility support for async calls from 
client side (similar to what can be done with SvcUtil-generated 
proxies), when using channelfactory and intereface contract only.
Something like What Ayende wrote about here: 
http://ayende.com/Blog/archive/2008/03/29/WCF-Async-without-proxies.aspx
but without having to write IAsyncBus

I have very rough (but working) implementation.

But...

given we don't have an actual async methods to call, we have to have an 
alternative syntax (well, at least until C# 4.0 and IDynamicObject, but 
that's another story)
http://paste2.org/p/198506 here's what I came up with.
I encourage you to discussion about it. If you have alternative, better 
ideas, you can show it here: http://paste2.org/followup/198506

Thanks,

Krzysztof


________________________________
 Enjoy a safer web experience. Upgrade to the new Internet Explorer 8 optimised 
for Yahoo!7. Get it now..





________________________________
 Yahoo!7 recommends that you update your browser to the new Internet Explorer 
8. Get it now..
CONFIDENTIALITY NOTICE
This message is intended exclusively for the individual or entity to which it 
is addressed. This communication may contain information that is proprietary, 
privileged, confidential or otherwise legally exempt from disclosure. If you 
are not the named addressee, you are not authorized to read, print, retain, 
copy or disseminate this message or any part of it. If you have received this 
message in error, please delete all copies of this message and notify the 
sender immediately by return mail or fax ATSI S.A.(+4812) 285 36 04.
Any email attachment may contain software viruses which could damage your own 
computer system. Whilst reasonable precaution has been taken to minimise this 
risk, we cannot accept liability for any damage which you sustain as a result 
of software viruses. You should therefore carry out your own virus checks 
before opening any attachments.


________________________________
 Chat right from the comfort of your inbox. Show me how..
CONFIDENTIALITY NOTICE
This message is intended exclusively for the individual or entity to which it 
is addressed. This communication may contain information that is proprietary, 
privileged, confidential or otherwise legally exempt from disclosure. If you 
are not the named addressee, you are not authorized to read, print, retain, 
copy or disseminate this message or any part of it. If you have received this 
message in error, please delete all copies of this message and notify the 
sender immediately by return mail or fax ATSI S.A.(+4812) 285 36 04.
Any email attachment may contain software viruses which could damage your own 
computer system. Whilst reasonable precaution has been taken to minimise this 
risk, we cannot accept liability for any damage which you sustain as a result 
of software viruses. You should therefore carry out your own virus checks 
before opening any attachments.


      Enjoy a safer web experience. Upgrade to the new Internet Explorer 8 
optimised for Yahoo!7. Get it now.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to