C# - 如何使这个线程等待?

时间:2010-08-16 20:54:10

标签: c# multithreading web-services

我有这个:

public class ServiceLibrary
{
    public object result = null;
    private bool finished = false;

    public void testar()
    {
       ServiceReference.Service1SoapClient serviceReference = new ServiceReference.Service1SoapClient();
       serviceReference.updateUserCompleted += new EventHandler<ServiceReference.updateUserCompletedEventArgs>(serviceReference_updateUserCompleted);
       serviceReference.updateUserAsync();
       ManualResetEvent m = new ManualResetEvent(true);

    }

    void serviceReference_updateUserCompleted(object sender, ServiceReference.updateUserCompletedEventArgs e)
    {
        result = e.Result;
        finished = true;
    }
}

外面我有这个:

public Home()
{
    InitializeComponent();

    ServiceLibrary serviceLibrary = new ServiceLibrary();
    serviceLibrary.testar();
    lblCharName.Text = Convert.ToString(serviceLibrary.result);

}

我应该怎么做线程等待,所以当我签​​署文本时,它包含值,请? 谢谢

4 个答案:

答案 0 :(得分:1)

你能否使用ManualResetEvent?或者创造一个新的。

我相信ManualResetEvent是线程安全的....

public class ServiceLibrary
{
    public object result = null;
    private bool finished = false;
    public ManualResetEvent m;

    public void testar()
    {
       ServiceReference.Service1SoapClient serviceReference = new ServiceReference.Service1SoapClient();
       serviceReference.updateUserCompleted += new EventHandler<ServiceReference.updateUserCompletedEventArgs>(serviceReference_updateUserCompleted);
       serviceReference.updateUserAsync();
       m = new ManualResetEvent(false);
    }

    void serviceReference_updateUserCompleted(object sender, ServiceReference.updateUserCompletedEventArgs e)
    {
        result = e.Result;
        finished = true;
        m.Set();
    }
}

public class ServiceLibrary { public object result = null; private bool finished = false; public ManualResetEvent m; public void testar() { ServiceReference.Service1SoapClient serviceReference = new ServiceReference.Service1SoapClient(); serviceReference.updateUserCompleted += new EventHandler<ServiceReference.updateUserCompletedEventArgs>(serviceReference_updateUserCompleted); serviceReference.updateUserAsync(); m = new ManualResetEvent(false); } void serviceReference_updateUserCompleted(object sender, ServiceReference.updateUserCompletedEventArgs e) { result = e.Result; finished = true; m.Set(); } }

public Home()
{
    InitializeComponent();

    ServiceLibrary serviceLibrary = new ServiceLibrary();
    serviceLibrary.testar();

    serviceLibrary.m.WaitOne();

    lblCharName.Text = Convert.ToString(serviceLibrary.result);
}

答案 1 :(得分:0)

使您的ManualResetEvent变量成为类的成员变量。 在你的线程方法中:serviceReference_updateUserCompleted,请务必调用 m.WaitOne();

答案 2 :(得分:0)

怎么样?
public class ServiceLibrary
{
  public object result = null;

  public void testar()
  {
     var serviceReference = new ServiceReference.Service1SoapClient();
     using(var m = new ManualResetEvent(false))
     {
       Action<object, ServiceReference.updateUserCompletedEventArgs> handler = 
       (sender, e) => 
       {
         result = e.Result;
         m.Set();
       };
       serviceReference.updateUserCompleted += handler;
       serviceReference.updateUserAsync();
       m.WaitOne();
       serviceReference.updateUserCompleted -= handler;
     }
  }
}

答案 3 :(得分:-2)

我有类似的情况。我使用了一种名为 polling 的技术,这听起来就像它。根据您的具体情况,它可能适合您,也可能不适合您。

public class ServiceLibrary
{
public object result = null;
private bool finished = false;

public void testar()
{
   ServiceReference.Service1SoapClient serviceReference = new ServiceReference.Service1SoapClient();
   serviceReference.updateUserCompleted += new EventHandler<ServiceReference.updateUserCompletedEventArgs>(serviceReference_updateUserCompleted);
   serviceReference.updateUserAsync();
   ManualResetEvent m = new ManualResetEvent(true);

while !finished
 Thread.Sleep(100);

doStuffWithResult(result);
}

void serviceReference_updateUserCompleted(object sender, ServiceReference.updateUserCompletedEventArgs e)
{
    result = e.Result;
    finished = true;
}