我已经尝试了很少的教程来解决我的问题...但是它就是这样一个biig和phat one -.-
以下是代码:
private void btnMonitor_Click(object sender, EventArgs e)
{
lock (m_lock)
{
if (thread_isRunning)
{
thread_isAbortRequested = true;
}
else
{
thread_isAbortRequested = false;
thread_isRunning = true;
ThreadPool.QueueUserWorkItem(BackgroundMethod);
}
}
//StartMonitoring();
}
是的,我实际上是遵循这个方法:How to start thread if button pressed and stop it if pressed again?
这就是为什么我的代码是这样的。
首先:
我的lil程序的目的是允许用户在文本框中输入路径,单击监视器按钮和BINGO,线程开始并继续监视指定文件夹中的确定文件(在本例中为txt),并且将它们添加到数据网格中。
实际上它已经在我的数据网格中列出..问题是:当点击监视器按钮时,线程只启动一次:(我想要像每3秒BAAZINGA新文件!!(如果添加在文件夹ofc)
我很漂亮,因为你们可以看到,我遇到所有这些线程和调用问题,交叉问题等等......你知道!
我不是要求一个有效的代码,只是建议和提示,使它成为一件很酷的事情
编辑1:
目前,唯一有错误的行是:ThreadPool.QueueUserWorkItem(BackgroundMethod);
错误列表说: 错误1'System.Threading.ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback)'的最佳重载方法匹配有一些无效的参数;
错误2参数1:无法从'方法组'转换为'System.Threading.WaitCallback';
编辑2:
该程序有3个主要类(不是主要的LOL),它们是:
Form.cs - >在我设置按钮事件的地方,调用我的特殊方法
ViewerManager - >实际上,我不确定这个...我添加了构造函数和一个从DirectoryManager类调用GetFiles()的Execute方法
DirectoryManager - >这个是我宝贵的类,有一个Execute(字符串路径),它调用ReadFiles(path)和GetFiles(path)..
GetFiles是一个字符串列表,并返回_files(字符串列表),由ReadFiles()填充。
编辑3:
eww,我让它刷新了datagrid视图,但它使用的是windows.forms.timer ..
我知道没有定时器吗? OBS:对不起我可怕的英语和像诺布一样的表演LOL答案 0 :(得分:1)
正如您所发现的,后台线程只会执行一次。你真的需要使用FileSystemWatcher
或某种计时器。
你最好的选择(如果你不想使用FileSystemWatcher)是使用DispatcherTimer
或BackgroundWorker
内的循环 - 对于你正在做的事情,我强烈推荐DispatcherTimer,它在UI线程上处理,这意味着您可以安全地更新您的数据网格而不会出现任何线程问题。
答案 1 :(得分:0)
如何使用FileSystemWatcher?