2011-07-27 75 views
1

我已经编写了一个Message Receive类的代码,该类使用backgroundworker来检查目录中的新文件(文件是从持续更新的用户接收的SMS消息)。如果该目录不为空,我会向每个新SMS发送确认消息并再次启动该工作人员。BackgroundWorker如何正确工作?

MessageReceiving mr = new MessageReceiving(); 
mr.bw.RunWorkerAsync(); 

我没有这一切,让我同步向用户发送消息 - -

public MessageReceiving() 
    { 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);   
    } 
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if(e.Result == true) 
     { 
     SendAcknowledgement(); 
     if(!bw.IsBusy) 
      bw.RunWorkerAsync(); 
     } 
    } 

void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     bool flag = false; 
     while (flag.Equals(false)) 
     { 
      string path = @"C:\SMS"; 
      if (Directory.GetFiles(path).Length > 0) 
      { 
       e.Result = true; 
       flag = true; 
      } 
      else 
      { 
       e.Result = false; 
      } 
     } 

    } 

我从主线程的初始化一次工人只要用户发送短信,我送他一个ACK。问题在于,即使发送一条短信,用户也会收到多个确认 - 为什么会发生这种情况?我想到了所有可能性,但无济于事!

+0

SendAcknowledgement方法被多次调用,或者只调用一次?注意:查看['FileSystemWatcher'类](http://msdn.microsoft.com/zh-cn/library/default.aspx)。com/en-us/library/system.io.filesystemwatcher.aspx),那么在旋转的情况下它将更有效率。 –

回答

2

考虑一下,当这个启动时会发生什么:

  • 你开始运行bw_DoWork
  • 这则紧环(不是一个好主意,开始用),直到它找到一个文件
  • 的后台工作完成,然后您发送确认信息
  • 然后,您立即再次运行后台工作程序,除非您在SendAcknowledgement期间删除了该文件,否则将再次找到该文件。你有吗?

嫌疑你真正想要的,而不是的这个任何FileSystemWatcher的方式。还要注意,仅仅因为文件是目前并不意味着它已完成写入,或者您可以读取它。

此外,您的紧密循环可以做了很多简单:

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string path = @"C:\SMS"; 
    while (!e.Result) 
    { 
     e.Result = Directory.GetFiles(path).Any(); 
    } 
} 

,我同样会改变

if (e.Result == true) 

if (e.Result) 

(假设e.Result的类型是bool;如果不是,您当前的代码有其他问题。)

+0

我移动了这些文件,但是当循环再次开始时,它们没有完全移动!谢谢你的提示。 – Aakar

1

这取决于未显示的代码。

您最多需要1个线程扫描文件。然后在处理过程中,您必须删除或重命名文件。在你的情况下,这应该发生在SendAcknowledgement中,并且Bgw在所有的回复被发送之前都不应该被重新启动。

最好先使用重命名文件并将它们推入队列中。或者在DoWork中查找文件后直接处理它们。 SendAcknowledgement(fileName)看起来更符合逻辑。

当前您的SendAcknowledgement()在主线程中运行,可能不是您想要的。