Для первой части, вероятно, самый простой подход:
Принимая метод согласно вашему описанию:
public double foo(int a, double b, string c)
{
...
}
Вы можете поставить это в очередь в пуле потоков с помощью:
ThreadPool.QueueUserWorkItem(o => foo(a, b, c));
Во второй части, хотя вы не можете ждать в потоке ThreadPool, вы можете асинхронно вызывать методы в пуле потоков и ожидать их завершения (что, по-видимому, является тем, что вы ищете).
Опять же, при условии, что метод Foo
определен, как указано выше.
Определение делегата для Foo:
private delegate double FooDelegate(int a, double b, string c);
Затем, чтобы вызвать Foo асинхронно, используя методы BeginInvoke / EndInvoke объекта FooDelegate:
// Create a delegate to Foo
FooDelegate fooDelegate = Foo;
// Start executing Foo asynchronously with arguments a, b and c.
var asyncResult = fooDelegate.BeginInvoke(a, b, c, null, null);
// You can then wait on the completion of Foo using the AsyncWaitHandle property of asyncResult
if (!asyncResult.CompletedSynchronously)
{
// Wait until Foo completes
asyncResult.AsyncWaitHandle.WaitOne();
}
// Finally, the return value can be retrieved using:
var result = fooDelegate.EndInvoke(asyncResult);
Для решения вопроса, поднятого в комментариях. Если вы хотите выполнить несколько вызовов функций параллельно и дождаться их возврата, прежде чем продолжить, вы можете использовать:
// Create a delegate to Foo
FooDelegate fooDelegate = Foo;
var asyncResults = new List<IAsyncResult>();
// Start multiple calls to Foo() in parallel. The loop can be adjusted as required (while, for, foreach).
while (...)
{
// Start executing Foo asynchronously with arguments a, b and c.
// Collect the async results in a list for later
asyncResults.Add(fooDelegate.BeginInvoke(a, b, c, null, null));
}
// List to collect the result of each invocation
var results = new List<double>();
// Wait for completion of all of the asynchronous invocations
foreach (var asyncResult in asyncResults)
{
if (!asyncResult.CompletedSynchronously)
{
asyncResult.AsyncWaitHandle.WaitOne();
}
// Collect the result of the invocation (results will appear in the list in the same order that the invocation was begun above.
results.Add(fooDelegate.EndInvoke(asyncResult));
}
// At this point, all of the asynchronous invocations have returned, and the result of each invocation is stored in the results list.