2010-11-16 19 views
0

我在我的智慧结束试图解决这个问题。需要帮助访问数据来自回调C#.NET

我有一个类中的功能,例如

public class ReceiveData 
{ 
    Dataprovider provider = new DataProvider(); 

    public void ResponseData() 
    { 
     foreach(string anItem in TheList) 
     { 
      // AllData function is declared in class DataProvider 
      string result = provider.AllData(anItem); 
     } 

     //do something 
    } 
} 

这很简单。但是,如果AllData函数必须进行异步函数调用以获取数据,我该怎么办?

含义,说

public class DataProvider 
{ 
    MyServiceClient client = new MyServiceClient(); 

    public string AllData (string myItem) 
    { 
     client.FormattedDataCompleted += new EventHandler<FormattedDataCompletedEventArgs>(client_FormattedDataCompleted); 
     client.FormattedDataAsync(myItem); 
    } 

    void client_FormattedDataCompleted(object sender, FormattedDataCompletedEventArgs e) 
    { 
     // here's where the response comes back. 
    } 

正如你所看到的,现在我不能简单地调用ALLDATA功能,并直接找回数据。

那么,我需要做什么在ResponseData函数中确保我调用AllItem函数,并从回调中获取数据。请注意,该函数中有一个循环,所以我需要通过循环发送的所有参数都会得到相应的响应。

我尝试过的一种方法是使用AutoResetEvent类。

我将此处理程序定义为 AutoResetEvent handle = new AutoResetHandle(false);

然后我在async调用之后立即添加handle.WaitOne()。并在回调中添加了handle.Set();

但是,应用程序卡在handle.WaitOne()。所以我不明白为什么会发生这种情况。

我现在有一个理论上的想法,看看我是否可以在回调中使用事件提升器,并在RecieveData类中使用eventlistener,如果这两者沟通,我可以获取数据。但我花了一些时间尝试了解更多关于事件处理程序的知识,但还没有掌握它。

那么有没有人有任何其他的方法,想法?谢谢!

+0

Sooo ...只是想了解...你想阻止请求的异步结果?你不想异步处理你的数据? – 2010-11-16 15:33:15

+0

在球部分,是 – Qgalore 2010-11-16 18:26:49

回答

0

欢迎使用异步模型。当你使用多线程时,你必须重新思考你如何调用方法。

你有一些选择:

  • 拆分的方法,其中你让通话成两半;在上半部分中,调用AllData,做任何其他的事情,否则你可能没有响应对象,然后退出当前的方法。当异步调用完成时,它会调用您的处理程序,您应该在那里执行需要响应的原始方法中的所有操作。

  • 在异步调用完成的事件处理程序中,设置一个指示调用已完成的属性,并将数据放在某处的某个属性上。在启动呼叫的功能中,在呼叫完成之前无法继续执行的地方,请等待一段时间循环后,通过轮询该属性完成呼叫,并在呼叫完成后断开,表明呼叫已完成(您的呼叫已完成)你可能需要一个Thread.Yield()以及当你还没有得到响应时调用,以确保你不会阻止其他线程做比等待更重要的事情)

  • 将您的异步调用包装在公开同步方法的类中。包装类将具有与将异步调用集成到方法中相似的逻辑。它将进行调用,等待响应,并将该响应作为普通的同步方法调用返回。

请记住,异步调用让您的调用线程有机会在调用时执行其他工作。尽可能充分利用这一点。

0

你只需要使用委托并调用BeginInvoke。然后,您可以设置一个回调方法来捕获委托调用的结果。

public class ReceiveData 
{ 
    private List<string> TheList = new List<string> 
    { 
     "1", "2", "3" 
    }; 

    dynamic provider = new ExpandoObject(); 

    public void ResponseData() 
    { 
     foreach (string anItem in TheList) 
     { 
      // AllData function is declared in class DataProvider 
      Func<string, string> asyncAllData = provider.AllData; 
      asyncAllData.BeginInvoke(anItem, AllDataDone, null); 
     } 
     //do something 
    } 

    private void AllDataDone(IAsyncResult iar) 
    { 
     AsyncResult ar = (AsyncResult)iar; 
     var del = (Func<string, string>)ar.AsyncDelegate; 
     // here's your result 
     string result = del.EndInvoke(iar); 
    } 
} 
+0

嗨史蒂文,谢谢你的职位。我试图根据您提供的概念开展工作。但是,语句Func asyncAllData = provider.AllData;返回一个错误'System.Dynamic.ExpandoObject'不包含'AllData'的定义。“我必须做任何事情来确保在运行时拾取函数吗? – Qgalore 2010-11-16 18:56:09