[英]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.