簡體   English   中英

C# - 如何讓這個線程等待?

[英]C# - How to make this thread wait?

我有這個:

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);
    
}

我應該對線程等待做什么,所以當我分配文本時,它包含值,請問? 謝謝

你不能使用你的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 Home() { InitializeComponent(); ServiceLibrary serviceLibrary = new ServiceLibrary(); serviceLibrary.testar(); serviceLibrary.m.WaitOne(); lblCharName.Text = Convert.ToString(serviceLibrary.result); }

使您的 ManualResetEvent 變量成為該類的成員變量。 在線程方法中:serviceReference_updateUserCompleted,確保調用 m.WaitOne();

關於什么

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;
     }
  }
}

我有類似的情況。 , which is exactly what it sounds like.我使用一種稱為的技術,這正是它聽起來的樣子。 根據您的情況,它可能適合您,也可能不適合您。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM