线程暂停问题

时间:2015-08-04 09:22:59

标签: c# multithreading

好的,我正在开发一个控制台应用程序,它执行一些不太特别相关的奇特数据库处理,但是我需要程序暂停并等待FileSystemEventHandler事件。在线查看我使用Thread.Sleep(10000)函数10秒钟,同时它监视要移动的文件(或删除,稍后在别处检查)。等待有效,但这是关键。移动文件后,它会执行大量的函数,但原始线程休眠会继续计数并结束程序,即使程序仍在执行。

我的问题似乎是我不小心钻研了并发的世界,实际上我只想坚持几秒钟。所以要么我需要改变我的等待方法,要么使用一些线程处理。有什么建议吗?

注意:此程序将从服务器运行,因此需要用户输入的函数(即Console.ReadKey())将无法工作,因为没有人会在那里结束程序。

以下是相关的代码部分:

File.Move("XX" + filename); //Omitted the path name
//Now we watch if the file leaves. If it does, find it in the other directories.
csvwatch.Deleted += new FileSystemEventHandler(csvwatch_Moved);//Watch for a deletion (move is a copy then delete)
System.Threading.Thread.Sleep(10000); //10000 = 10 seconds

(如果函数调用文件删除,则为csvwatch_Moved)

2 个答案:

答案 0 :(得分:1)

如果你使用的是.Net 4.5,你可以使用Taha提到的asyncawait,你可以使File.Move()进程异步,一旦移动完成,你就可以然后可以执行下一个作业/功能,而不会牺牲应用程序的响应能力。示例代码:

static void Main(string[] args)
{
    Test();
    Console.ReadLine();
}

static public async void Test() {
    Console.WriteLine("Will move...");
    await MoveAsync();

    //Will pause here while moving
    //Do next job here...
    Console.WriteLine("Move was completed. On to next job!!");
}

static public async Task MoveAsync()
{
    await Task.Run(() => Move());
}

static public void Move()
{
    //Do moving of file here....

    //System.IO.File.Move()
    System.Threading.Thread.Sleep(10000); // Simulate moving...

    //Completed?
    Console.WriteLine("Moved.");
}

答案 1 :(得分:-1)

您可以将async方法与await一起使用。 如果你不能,你可以在无限循环中检查一个标志变量,当你的条件满足时你可以打破循环。这样你就不需要知道你需要等多少。