gpt4 book ai didi

c# - 控制下载过程的信号量

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:11 25 4
gpt4 key购买 nike

我在这段代码中使用了信号量

static Semaphore s = new Semaphore(1,1);
private void button2_Click(object sender, EventArgs e)
{

Thread[] t = new Thread[full_list];
for(int i=0;i<full_list;i++)
{
if (sorted_list[i].audio_node != null)
if (sorted_list[i].audio_node.Checked == true)
{
t[i] = new Thread(DownloadFile);
t[i].Start(sorted_list[i]);
}
}

}

private void DownloadFile(object a)
{
s.WaitOne();
if (InvokeRequired)
{
BeginInvoke(new DownloadFileDelegate(DownloadFile),new object[1] {a} );
return;
}
else
{
download process....

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
s.Release();
}

但是它不起作用,我的程序卡住了。我正在尝试解决这个问题,但我不知道为什么它不适用于 Semaphore。所有组件都包括正确下载工作。

最佳答案

您正在非图形用户界面线程上运行 DownloadFile。在获取信号量的方法中,然后调用 InvokeRequired。它将返回 true 因为您不在 gui 线程上,所以您在 gui 线程上调用 DownloadFile。然后您在不释放信号量的情况下返回,因此当DownloadFile` 在 gui 线程上运行时,它会尝试做的第一件事就是获取信号量,因为它不能获取信号量,所以它会阻塞。

在你的代码中创建一个线程并没有多大意义,它只是在 gui 线程上安排一个回调。您真正需要做的是在非图形用户界面线程上下载文件,然后当您下载文件时,回调图形用户界面线程来处理您下载的内容。

关于信号量,您应该将代码包装在 try\finally block 中以确保它始终被释放,即使您在代码中间有一个返回:

s.WaitOne();
try
{
// Rest of method
}
finally
{
s.Release();
}

关于c# - 控制下载过程的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com