using System.Threading.Tasks;
using MyComplicatedAsyncLibrary1;
namespace WpfApplication1
public partial class MainWindow : Window, INewValueHandler
private void Button1_OnClick(object sender, RoutedEventArgs e)
var c2 = new ClassFromMyLibrary2(this);
var v1 = c2.MethodFromLibrary2();
System.Diagnostics.Trace.TraceError("{0}", ex);
public Task<string> ActionToProcessNewValue(string s)
return Task.FromResult(string.Format("test2{0}", s));
namespace MyPluginLibrary
public class ClassFromMyLibrary2
private readonly INewValueHandler _newValueHandler;
public ClassFromMyLibrary2(INewValueHandler newValueHandler)
_newValueHandler = newValueHandler;
public string MethodFromLibrary2()
var c = new ClassFromMyLibrary1(_newValueHandler);
var v1 = c.MethodFromMyLibrary1("test1").Result;
namespace MyComplicatedAsyncLibrary1
public class ClassFromMyLibrary1
private readonly INewValueHandler _newValueHandler;
public ClassFromMyLibrary1(INewValueHandler newValueHandler)
_newValueHandler = newValueHandler;
public async Task<string> MethodFromMyLibrary1(string key)
var remoteValue = await GetValueByKey(key).ConfigureAwait(false);
var newValue = string.Format("Remote-{0}", remoteValue);
var processedValue = await _newValueHandler.ActionToProcessNewValue(newValue).ConfigureAwait(false);
return string.Format("Processed-{0}", processedValue);
private async Task<string> GetValueByKey(string key)
await Task.Delay(500).ConfigureAwait(false);
return string.Format("ValueFromRemoteLocationBy{0}", key);
public interface INewValueHandler
Task<string> ActionToProcessNewValue(string s);