Если вы контролируете B, то ответы Роба Пруза или Броди будут работать нормально.
Но что, если вы вообще не можете изменить B? В этом случае вы всегда можете заключить метод в делегат вашего собственного создания, если его подпись совпадает с сигнатурой целевого метода.
Итак, скажем, у вас есть экземпляр класса с именем B и открытый метод с именем b () (конечно, из сборки Bllll). Класс A в приложении A может вызывать его асинхронно следующим образом:
public class A
{
delegate void BDelegate();
public void BegineBMethod()
{
BDelegate b_method = new BDelegate(B.b);
b_method.BeginInvoke(BCallback, null);
}
void BCallback(IAsyncResult ar)
{
// cleanup/get return value/check exceptions here
}
}