pinaki
pinaki

Reputation: 261

Callback syncronization between threads

I want to wait on the GetValues.Get Method and return the values syncronously to the caller. The ServerDataProvider, BookDataFetcher classes are external to mycode, on which I have no control. Any help on how to achieve this is much appreciated.

namespace Test {
class Program
{
    static void Main(string[] args)
    {
        GetValues val = new GetValues();
        val.Get("BOOKS", DataHandler);
        Console.ReadKey();
    }

    static void DataHandler(IList<string> values) {
    }
}

class GetValues
{
    public delegate void DataHandler(IList<string> values);
    public event DataHandler OnReceiveDataHandler;

    public void Get(string colName, DataHandler handler)
    {
        OnReceiveDataHandler += handler;
        GetDataFromServer svr = new GetDataFromServer();
        svr.OnReceiveDataHandler += OnReceiveData;
        svr.GetData(colName);
    }

    // Callback Handler
    private void OnReceiveData(IList<string> values) {
        OnReceiveDataHandler(values);
    }
}

class GetDataFromServer
{
    internal delegate void DataHandler(IList<string> values);
    internal event DataHandler OnReceiveDataHandler;

    internal void GetData(string columnName)
    {
        ServerDataProvider datafetcher = new ServerDataProvider();
        datafetcher.OnReceiveDataHandler += OnReceiveData;
        Task.Factory.StartNew(() => datafetcher.GetDataFromServer(columnName));
    }

    // Callback Handler
    private void OnReceiveData(IList <string> values) {
        OnReceiveDataHandler(values);
    }
}

class ServerDataProvider
{
    internal delegate void DataHandler(IList<string> values);
    internal event DataHandler OnReceiveDataHandler;

    public void GetDataFromServer(string columnName)
    {
        BookDataFetcher b = new BookDataFetcher();
        b.OnReceiveDataHandler += OnReceiveData;
        Task.Factory.StartNew(() => b.GetBookData(columnName));
    }

    // Calback Handler
    private void OnReceiveData(IList<string> values)
    {
        OnReceiveDataHandler(values);
    }
}

class BookDataFetcher
{
    internal delegate void DataHandler(IList<string> values);
    internal event DataHandler OnReceiveDataHandler;

    public void GetBookData(string col)
    {
        Thread.Sleep(5000);
        OnReceiveDataHandler(new List<string> {"Book1", "Book2"});
    }
}

}

Upvotes: 0

Views: 103

Answers (1)

vittore
vittore

Reputation: 17579

What you are asking can be achieved using MethodImplAttribute

 [MethodImplAttribute(MethodImplOptions.Synchronized)] 
 public void MethodA()

Upvotes: 1

Related Questions