Avi*_*vik 2 c# multithreading synchronization
我在c#中有两个线程.现在我需要等待一个特定的语句执行才能继续执行另一个线程,这显然是同步的情况.是否有任何代码可以像使用内置方法一样执行此操作?
这是代码示例:
public void StartAccept()
{
try
{
newSock.BeginAccept(new AsyncCallback(Accepted), newSock);
}
catch (ArgumentException)
{
MessageBox.Show("Error in arguments while using begin-accept", "Error", MessageBoxButtons.OK);
}
catch (ObjectDisposedException)
{
MessageBox.Show("socket closed while using begin-accept", "Error", MessageBoxButtons.OK);
}
catch (SocketException)
{
MessageBox.Show("Error accessing socket while using begin-accept", "Error", MessageBoxButtons.OK);
}
catch (InvalidOperationException)
{
MessageBox.Show("Invalid operation while using begin-accept", "Error", MessageBoxButtons.OK);
}
catch (Exception)
{
MessageBox.Show("Exception occurred while using begin-accept", "Error", MessageBoxButtons.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
这将从代码选择的所需主机接收数据:
private void listBox1_Click(object sender, EventArgs e)
{
String data = (String)this.listBox1.SelectedItem;
ip = Dns.GetHostAddresses(data);
clientIP = new IPEndPoint(ip[0], 5555);
newSock.Bind(clientIP);
newSock.Listen(100);
}
Run Code Online (Sandbox Code Playgroud)
因此,为了开始接收数据,我需要将套接字初始化为特定的远程主机,这是在我单击列表框中显示的其中一个主机时完成的.为此,我需要同步.
Mat*_*son 11
看一下AutoResetEvent和ManualResetEvent.它们是使线程之间的同步成为可能的信号.
需要等待完成某事的第一个线程将执行myEvent.WaitOne(),阻塞直到另一个线程调用myEvent.设置().
假设我们有两个线程,其中一个线程需要在另一个线程可以继续之前进行某种初始化.然后在两者之间共享一个AutoResetEvent,让我们称之为myEvent.
// Signal example
using System;
using System.Threading;
class MySync
{
private readonly AutoResetEvent _myEvent;
public MySync(AutoResetEvent myEvent)
{
_myEvent = myEvent;
}
public void ThreadMain(object state)
{
Console.WriteLine("Starting thread MySync");
_myEvent.WaitOne();
Console.WriteLine("Finishing thread MySync");
}
}
class Program
{
static void Main(string[] args)
{
AutoResetEvent myEvent = new AutoResetEvent(false);
MySync mySync = new MySync(myEvent);
ThreadPool.QueueUserWorkItem(mySync.ThreadMain);
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
myEvent.Set();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("Finishing");
}
}
Run Code Online (Sandbox Code Playgroud)
不要将此与访问顺序无关紧要的共享资源混淆.例如,如果您有共享列表或共享字典,则需要将其包装在互斥锁中以确保它们正确执行.
// Mutex example
object mySync = new object();
Dictionary<int, int> myDict = new Dictionary<int, int>();
void threadMainA()
{
lock(mySync)
{
mySync[foo] = bar;
}
}
void threadMainB()
{
lock(mySync)
{
mySync[bar] = foo;
}
}
Run Code Online (Sandbox Code Playgroud)