好的,我正在开发一个控制台应用程序,它执行一些不太特别相关的奇特数据库处理,但是我需要程序暂停并等待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)
答案 0 :(得分:1)
如果你使用的是.Net 4.5,你可以使用Taha提到的async
和await
,你可以使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
一起使用。 如果你不能,你可以在无限循环中检查一个标志变量,当你的条件满足时你可以打破循环。这样你就不需要知道你需要等多少。