Мехрдад Афшари отвечает на ваш вопрос как можно лучше. Однако я бы посоветовал против этого, если это вообще возможно. Если ваша бизнес-объект не несет единоличную ответственность за синхронный или асинхронный запуск, вы нарушаете принцип единой ответственности 1002 *, даже пытаясь заставить его осознать тот факт, что он может работать асинхронно. Достаточно просто выполнить этот тип операции в классе потребления с использованием анонимных делегатов:
public void Foo(int x, int y)
{
ThreadPool.QueueUserWorkItem(delegate
{
// code to execute before running
myObject.MyFunction(x, y);
// code to execute after running
});
}
Если у вас нет кода для запуска до или после, вы можете использовать лямбду, чтобы сделать его более кратким
ThreadPool.QueueUserWOrkItem(() => myObject.MyFunction(x, y));
EDIT
В ответ на комментарий @ kshahar ниже, экстернализация асинхронности все еще является хорошей идеей. Это общая проблема, которая решалась с помощью обратных вызовов в течение десятилетий. Лямбды просто сокращают маршрут, а .Net 4.0 делает его еще проще.
public void Foo(int x, int y)
{
int result = 0; // creates the result to be used later
var task = Task.Factory.StartNew(() => // creates a new asynchronous task
{
// code to execute before running
result = myObject.MyFunction(x, y);
// code to execute after running
});
// other code
task.Wait(); // waits for the task to complete before continuing
// do something with the result.
}
.Net 5 делает это еще проще, но я недостаточно знаком с ним, чтобы сделать заявление, выходящее за рамки этого.