Я новичок в асинхронном программировании. У меня есть C # dll с асинхронным методом, который вызывается, принимает указатель на функцию (делегат) и вызывает эту функцию обратного вызова после вычисления «результата».
public delegate void CreatedDelegate(Foo result);
public void CreateAsync(CreatedDelegate createdCallback)
{
Task t = Task.Factory.StartNew(() =>
{
Foo result = ...
createdCallback(result);
});
}
Обратный вызов делегата типа «CreatedDelegate» является (в моем случае) указателем на метод C ++ / CLI, который работает с результатом.
void CreatedCallback(Foo^ result)
{
// do something with result
}
Так что в большинстве случаев эта асинхронная концепция, кажется, работает достаточно хорошо, но иногда я сталкиваюсь с некоторыми ошибками. Как я могу добиться этого, если функция «CreateAsync» вызывается несколько раз с разными вычислительными усилиями, чтобы результирующие вызовы «CreatedCallback» просто происходили в том же порядке, в котором первоначально вызывался «CreateAsync»? Чтобы сделать его более понятным: первый вызов «CreateAsync» должен привести к первому вызову «CreatedCallback», даже если последующий вызов «CreateAsync» будет быстрее и фактически вызовет обратный вызов ранее.
Может быть, это можно сделать, разрешив только один активный новый поток в асинхронном "CreateAsync" одновременно?