我阅读了很多事件和线程讨论,但是如果我不知道某个事件并尝试稍后调用它,那么所有这些都集中在"会发生什么".我的问题是不同的...如果我在线程A中有一个进程以毫秒1触发事件"我完成",并且在线程B中有一个进程以毫秒2激活事件"我完成",将会发生什么.
两个进程都被用于监听和处理事件的相同方法.因此,C#必须执行处理事件2次的方法:1次用于在线程A中触发的事件,1次用于从线程B触发的事件.
会发生什么??当"来自线程A的第一个事件"开始执行处理事件的方法时,C#是否锁定该方法,并在完成执行时解锁该方法,从而允许其他等待"事件"执行方法内容?
或者从线程A触发的事件将开始执行处理事件的方法,1毫秒后,从线程B触发的事件也将在相同的方法上开始执行,而不会注意到当前该方法正由其他人执行"处理"???
我问这个,因为我想在捕获事件的方法中写一些文件,但如果方法可以同时执行(取决于事件被触发的时间),我想我不能在这里做,因为关于该文件将是两个进程同时写入同一文件的混合(不是文件的有效信息).
我的代码看起来像这样(有点长,对不起).请注意这不会编译,只是一个示例,以显示我在做什么:
public partial class MainForm : Form
{
FTPClientManager client = null;
public MainForm()
{
InitializeComponent();
}
private void btnConnect_Click(object sender, EventArgs e)
{
Connect(this.tbFTPServer.Text.Trim());
this.lstLog.Items.Add("Connected"); //This lstLog is a list box that will have a list of downloaded files from all threads.
}
void Connect(string urlStr)
{
try {
client = new FTPClientManager();
//subscribe to the event
client.FileDownloadCompleted += new EventHandler<FileDownloadCompletedEventArgs>(client_FileDownloadCompleted);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void client_FileDownloadCompleted(object sender, FileDownloadCompletedEventArgs e) …
Run Code Online (Sandbox Code Playgroud) 我有一个可以从许多线程调用的方法,但我只是希望第一个线程在方法内部做一些逻辑.所以,我打算使用一个布尔变量.进来的第一个线程将布尔变量设置为false(以防止进一步的线程进入),并执行方法逻辑.
来到此方法的后续线程将检查布尔变量.因为第1个线程将其设置为false,所以它们将跳过方法逻辑.
在代码中,这样的事情:
private void myMethod()
{
if (firsTime) //set to true in the constructor
{
firstTime = false; //To prevent other thread to come inside here.
//method logic
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用锁来执行此操作,但不确定将其放在何处.
如果我锁定"if"以将firstTime更改为false,则可能的2个或更多线程已经进入if(不想要这个).
如果我在"if"之外锁定以将firstTime更改为false,那么第一个线程怎么能进入if执行方法逻辑,如果firstTime它已经设置为false?
我的问题是:如何锁定以获得所需的功能?(设置布尔和执行方法逻辑的第一个线程).
我无法锁定所有方法逻辑,因为这将是一个非常耗时的操作.