私はaysncの理解が限られているので、これが基本的であれば謝ります。メソッドが非同期呼び出しの結果を待つ
私のメソッドで連絡先を照会するのにLync SDKを使用していますが、SDKはasyncを使用して検索を行い、結果をコールバックに返します。
私のメソッドSearchForContactをすべての結果が得られた状態で呼び出し元に戻さないようにしたいのですが、これを行う方法がわかりません。
ありがとうございました。
public void SearchForContact(string search)
{
var searchFields = _LyncClient.ContactManager.GetSearchFields();
object[] _asyncState = { _LyncClient.ContactManager, search };
_LyncClient.ContactManager.BeginSearch(search, SearchProviders.GlobalAddressList | SearchProviders.ExchangeService
, searchFields
, SearchOptions.Default
, 10
, result =>
{
searchForContactResults = new List<MeetingContact>();
SearchResults results = null;
results = ((ContactManager)_asyncState[0]).EndSearch(result);
if(results == null)
return;
MeetingContact contactResult = new MeetingContact();
foreach (var searchResult in results.AllResults)
{
var c = searchResult.Result as Contact;
contactResult.FullName = c.GetContactInformation(ContactInformationType.DisplayName).ToString();
contactResult.SipAddress = c.Uri;
searchForContactResults.Add(contactResult);
}
if (ResultOfSearchForContactEvent != null) ResultOfSearchForContactEvent(searchForContactResults); //returns results to subscriber fine, however I'd perfer not to do this
}
, _asyncState);
//I want to return List<MeetingContact> here once BeginSearch has completed
}
EDIT:
ので、私は基本的にBeginSearchが完了するまでスレッドの睡眠をすることによってそれをやりました。より良い方法が必要でしょうか?
public List<MeetingContact> SearchForContact(string search)
{
var searchFields = _LyncClient.ContactManager.GetSearchFields();
object[] _asyncState = { _LyncClient.ContactManager, search };
bool isComplete = false;
_LyncClient.ContactManager.BeginSearch(search, SearchProviders.GlobalAddressList | SearchProviders.ExchangeService
, searchFields
, SearchOptions.Default
, 10
, result =>
{
searchForContactResults = new List<MeetingContact>();
SearchResults results = null;
results = ((ContactManager)_asyncState[0]).EndSearch(result);
if(results == null)
return;
MeetingContact contactResult = new MeetingContact();
foreach (var searchResult in results.AllResults)
{
var c = searchResult.Result as Contact;
contactResult.FullName = c.GetContactInformation(ContactInformationType.DisplayName).ToString();
contactResult.SipAddress = c.Uri;
searchForContactResults.Add(contactResult);
}
isComplete = true;
}, _asyncState);
while (isComplete == false)
{
Thread.Sleep(50);
}
return searchForContactResults;
}
このメソッドを非同期に呼び出し、結果を待たずにしますか? –
@Romaこのメソッドが – Damo
を返す前に "_LyncClient.ContactManager.BeginSearch"を終了したいと思います@Damo SearchForContactsは最初のソースのようにvoidを返す必要があります。リストをファイルする必要があります。 。このリストを消費するのは何ですか?それを非同期に変換することができます。また、バグがあります。何もないとき( 'results == null')が返され、ループは無限であるときにisCompleteを設定していません。 –