У нас есть этот общий сценарий, в котором у нас есть метод, который выполняет какое-то действие асинхронно и вызывает событие, когда это будет сделано.Есть ли общий способ синхронизации асинхронного метода?
Есть времена, когда мы хотим сделать это синхронно, а не так, у нас есть код, который выглядит примерно так:
ManualResetEvent reset = new ManualResetEvent(false);
someobject.AsyncActionDone += (sender, args) => reset.Set();
someobject.PerformAsyncAction();
reset.WaitOne();
Есть ли способ, чтобы написать вспомогательный метод, чтобы сделать это? Я могу пройти в Action для выполнения, но я не уверен, как передать что-то, что позволяет вспомогательному методу знать, какое событие прослушивать, поскольку оно не выглядит так, как вы можете передать EventHandler в качестве параметра.
Предпочтительно решение, которое не требует отражения
Там, кажется, некоторое замешательство, это пример того, что SomeObject своего класса, как:
public class SomeClass
{
private ExternalServer someServerOverTheNetwork = new ExternalServer();
public event EventHandler AsyncActionDone;
public Data SomeData { get; set; }
public void PerformAsyncAction()
{
someServerOverTheNetwork.GetSomeData(OnDataRetrived);
}
public Data OnDataRetrived(Data someData)
{
AsyncActionDone(this, new DataEventArgs(someData));
}
}
Вы являетесь разработчиком какого-либо объекта или это тип библиотеки, который нельзя изменить? –
Мы, однако, таких объектов много. Большинство действий связаны с отправкой запроса на сервер и ожиданием возврата результата, следовательно, по умолчанию они асинхронны. – Davy8
У нас есть способ сделать это для одного из наших наиболее распространенных действий, кэшируя список объектов с сервера, однако это зависит от знания точного типа объекта и события для прослушивания. Я хотел бы иметь возможность передать, в каком событии слушать, чтобы мы могли уменьшить дубликат кода, так как единственное, что отличается, - это метод и событие, которое возникает после завершения. – Davy8