执行以下操作时,while
循环永远不会结束。我正在调用一个方法来获取while循环条件的值。请告诉我我做错了什么?
using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.IO;
namespace BuildActivities
{
public sealed class CheckFile : CodeActivity
{
public InArgument<string> DirectoryName;
protected override void Execute(CodeActivityContext context)
{
Activity workflow = new Sequence
{
Activities =
{
new While
{
Condition = GetValue() ,
Body = new Sequence
{
Activities = {
new WriteLine
{
Text = "Entered"
},
new WriteLine
{
Text = "Iterating"
},
new Delay
{
Duration = System.TimeSpan.Parse("00:00:01")
}
}
}
//Duration = System.TimeSpan.Parse("00:00:01")
},
new WriteLine()
{
Text = "Exited"
}
}
};
try
{
WorkflowInvoker.Invoke(workflow, TimeSpan.FromSeconds(30));
}
catch (TimeoutException ex)
{
Console.WriteLine("The File still exist. Build Service has not picked up the file.");
}
}
public bool GetValue()
{
bool matched = false;
matched = File.Exists(@"\\vw189\release\buildservice\conshare.txt");
return matched;
}
}
}
当代码执行时,我认为它只检查while条件一次。因为,我写了一些写作线来检查它是如何工作的。我看到循环永远不会结束。我通过在循环运行时删除文件夹中的文件来测试它。有一项服务应该每5秒选择一次文件。这是为了确定该服务是否已启动并运行。
答案 0 :(得分:1)
同样,我不明白你在做什么,但在CodeActivity中进行工作流调用是错误的。我会试着给你一些选择。
选项1:
让CodeActivity
返回一个指示文件是否存在的布尔值是标准/正确的方式。然后,您可以在工作流程中使用此活动:
public sealed class CheckFile : CodeActivity<bool>
{
public InArgument<string> FilePath { get; set; }
protected override bool Execute(CodeActivityContext context)
{
return File.Exists(FilePath.Get(context));
}
}
选项2:
与您的代码一起,您可以通过InvokeMethod致电File.Exists()
:
var workflow = new Sequence
{
Activities =
{
new While
{
Condition = new InvokeMethod<bool>
{
TargetType = typeof (File),
MethodName = "Exists",
Parameters = { new InArgument<string>("c:\\file.txt") }
},
Body = new WriteLine {Text = "File still exists..."}
},
new WriteLine {Text = "File deleted."}
}
};
PS:在GetValue
运行工作流之前,只调用一次WorkflowInvoker
{{1}}。如果您希望它是动态,请使用像InvokeMethod这样的活动,就像我在上面展示的那样。同样,不要仅仅因为特别是在CodeActivity中使用工作流程。