До сих пор я мог сделать тип делегата, например:
// Can't use Task in WinRT interface and TypedEventHandler doesn't work with async await
public delegate IAsyncOperation<string> AsyncEventHandler(object sender, object args);
А потом выставить в WinRT объект так:
public AsyncEventHandler OnMyEvent { get; set; }
В объекте WinRT я бы назвал его так:
if (OnMyEvent != null)
{
var result = await OnMyEvent.Invoke(this, someArgs);
// Do something with the result...
}
И клиентский код, потребляющий объект WinRT, может сделать это:
instanceOfWinRTObject.OnMyEvent = OnCalledBackFromWinRT;
Но так как делегат возвращает IAsyncOperation
, нам нужно сделать обтекание:
private async Task<string> OnCalledBackFromWinRTAsync(object sender,
object args)
{
return await GetSomeStringAsync(args);
}
private IAsyncOperation<string> OnCalledBackFromWinRT(object sender, object args)
{
return OnCalledBackFromWinRTAsync(sender, args).AsAsyncOperation();
}
Такое ощущение, что должен быть более чистый способ достижения этого.