我有一个简单的任务,我想在后台运行。任务应该只是尝试移动文件。此任务可能会失败,因为该文件正在另一个进程中使用。
我想在指定的时间段内重试此操作,然后timeout
如果文件仍处于锁定状态。
我读到了Polly并认为这对我的需求是理想的。
代码最终将包含在ASP.NET
应用中,但我已经创建了一个小型控制台应用,试图展示我想要实现的目标。
这是我第一次使用Polly尝试,所以我可能完全不合适了,但只要我在Visual Studio 2013
中运行应用程序,就会出现以下错误:
An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
Additional information: Please use asynchronous-defined policies when calling asynchronous ExecuteAsync (and similar) methods.
以下是代码:
class Program
{
static void Main(string[] args)
{
RunMyTask().GetAwaiter().GetResult();
}
private static async Task RunMyTask()
{
var timeoutPolicy = Policy.Timeout(TimeSpan.FromSeconds(20), TimeoutStrategy.Pessimistic, (context, span, arg3) => {});
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async () =>
{
await Task.Run(() =>
{
while (!MoveFiles())
{
}
});
});
if (policyResult.Outcome == OutcomeType.Failure && policyResult.FinalException is TimeoutRejectedException)
{
Console.WriteLine("Operation Timed out");
}
else
{
Console.WriteLine("Operation succeeded!!!!!");
}
}
private static bool MoveFiles()
{
try
{
var origFile = @"c:\temp\mydb.sqlite";
var tempFile = @"c:\temp\mydb.sqlite.tmp";
File.Move(origFile, tempFile);
File.Move(tempFile, origFile);
return true;
}
catch (Exception)
{
return false;
}
}
我做错了什么?
答案 0 :(得分:3)