You do not need two different programs. While it is easier that way you can stick with one that runs in different modes.
WCF
, WebApi
, ServiceStack
, MessageBus
can be used for that.
But you are making a jump that is hard to achieve at once.
You have a synchronous local application (everything runs in one app) and you want to get to an asynchronous remote application (everything is parallelized and executed on a different machine).
WCF
etc. gives you an easy start, however I would recommend smaller steps as it does not mitigate all issues.
First keep your synchronous application and make it asynchronous. So it issues some message (say the two doubles) to itself in a multi-threaded environment and waits for it without blocking.
This introduces its own set of issues (threading, waiting, locks).
After you've done that you should externalize your functionality to a separate application or the same application running in a "server" mode, resulting in an asynchronous local application. In this step you cross application boundaries while already having achieved threading and still being local.
After you've done that, start thinking about placing the server application on a remote machine and deal with that (communication, resource availability, protocols, etc.)
Each step is complex. By doing everything at once you will need to handle multithreading, blocking application, the complexity of WCF
, connection handling (timeouts, proxies, not available resources, connection interrupts, etc.) and outsourced processing at the same time at once.