this is a more \"can it be done\" rather than a \"how is it done\" question. I\'m looking at building a service (middle tier, .net, providing data abstraction and some business
Methods are synchronous by default. To make them asynch, you need to add this attribute [OperationContract(AsyncPattern=true)] and return an IAsynchResult, just like you would if you were doing BeginIvoke() with winforms. (read more here http://msdn.microsoft.com/en-us/library/ms734701.aspx)
You can do publish/subscribe with something called a Callback Contract (although im not sure about implementing this in other platforms) I don't have much experience with these, but they don't seem hugely complected(you can read more here http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm)
Setting up async operations on your WCF service can be done as Ninja posted by setting AsyncPattern=true or it can be done on the client side by telling svcutil to generate the async end points by setting the correct command line argument or by checking the "Generate asynchronous operations" option in the GUI version of svcutil. Generating async will still generate synchronous operations as well.
The issue with the client async option is you will need to duplicate the code in Java. Svcutil does export VB or C# code as you specify so you could very likely translate the C# code to Java without too much work.
For Pub/Sub, client callbacks are how you want to operate. I am using them and they work very well. At the root level, they are .Net Remoting and use eventing to pass the data to the client (my understanding). I cannot confirm that this could be used cross platform but it should be with some work.