如何仅在从长过程中填充对象之后才返回对象集合



我有一个来自第三方SDK的对象数据库。它们提供了一种基于事件的搜索方法。我希望搜索事物,并且只在搜索完成后返回结果。这是我正在使用的伪代码:

Class SearchThings
{
private Object DatabaseOfDifferentThings;

private List<Thing> _objects = null;
private SearchSession _search = null;
private bool _initialized = false;

public SearchThings()
{

}

Public List<thing> GetFoundThings()
{
if (_initialized == false)
{
StartSearch();  
}

return _objects;
}

private void StartSearch()
{
_objects = new List<Thing>();
_search = DatabaseOfDifferentThings("TypeOfThingToSearchFor");
_search.ThingAvailable += OnThingAvailable;
_search.Progress += OnProgress;

_search.StartSearch();
}

private void OnThingAvailable(Thing thing)
{
_objects.Add(thing);
}

private void OnProgress(int progress)
{
if (progress == 100)
{
_search.StopSearch();
_search -= OnProgress;
_search -= OnThingAvailable;

_initialized = true;
}
}
}

我的意图是,只有当List被完全填充和初始化时,才从GetFoundThings((返回。由于搜索机制订阅事件来填充列表,我不确定如何使用异步等待或其他机制来";暂停";同时正在收集对象。

如有任何帮助,我们将不胜感激。

您可以使用TaskCompletionSource。

用法示例:

private TaskCompletionSource<object> _tcs = new TaskCompletionSource<object>();

更改StartSearch以返回Task

private Task StartSearch()
{
_objects = new List<Thing>();
_search = DatabaseOfDifferentThings("TypeOfThingToSearchFor");
_search.ThingAvailable += OnThingAvailable;
_search.Progress += OnProgress;

_search.StartSearch();
return _tcs.Task; // return Task that represents future work
}

然后在您的OnProgress中,当它达到100时,您可以完成Task

private void OnProgress(int progress)
{
if (progress == 100)
{
_search.StopSearch();
_search -= OnProgress;
_search -= OnThingAvailable;

_initialized = true;
_tcs.SetResult(null);
}
}

然后你可以这样称呼它:

public async Task<List<Thing>> GetFoundThings()
{
if (_initialized == false)
{
await StartSearch();  
}

return _objects;
}

最新更新