我需要编写一些基本上尝试重复与数据库通信并初始化的异步代码.通常,第一次尝试将失败,因此需要重试.
在旧的日子里,我会使用类似于以下的模式:
void WaitForItToWork()
{
bool succeeded = false;
while (!succeeded)
{
// do work
succeeded = outcome; // if it worked, mark as succeeded, else retry
Threading.Thread.Sleep(1000); // arbitrary sleep
}
}
Run Code Online (Sandbox Code Playgroud)
我发现最近对.NET的异步模式进行了很多更改,所以我的问题是这是最好的方法,或者在探索这些async内容时是否值得,如果是这样,我该如何实现这种模式async呢?
更新
为了澄清,我想异步生成这个工作,以便生成它的方法不必等待它完成,因为它将在服务的构造函数中生成,因此构造函数必须立即返回.
可能是这个问题在过去被问过,但我已经搜索过,但还没有找到它的解决方案.
我已经尝试了迄今为止我发现的所有选项,但都是徒劳的.SendKeys不起作用,因为它没有用文件路径填充文件输入框,即要上传.无法设置文件输入框"SetAttribute"值,因为没有可用的值属性:
就这样.
如果我使用element.focus(),它会弹出"选择要上传的文件"对话框,现在我不知道如何以编程方式填充它并在文件输入框中打开它.
我希望它自动完成,以便用户不必与应用程序进行交互.应用程序将从给定文件路径中从硬盘中选择文件并填写表单的其他字段然后开始上传,所有这些都使用Windows窗体应用程序中的webbrowser控件.
找不到解决方案!
有人可以帮忙吗?(这是我关于stackoverflow的第一个问题,因此如果我做错了那么请指导,我的意思是如果我不被允许发布这样的问题!)
这是代码:
HtmlElementCollection heCollection = doc.GetElementsByTagName("input");
foreach (HtmlElement heSpan in heCollection)
{
string strType = heSpan.GetAttribute("type");
string strName = heSpan.GetAttribute("name");
if (strType.Equals("file") && strName.Equals("file"))
{
heSpan.Focus();
//heSpan.SetAttribute("value", "test.jpg");
SendKeys.Send("C:\\1.txt");
//heSpan.InnerText = "c:\\1.txt";
}
//Title for the attachment
if (strName.Equals("field_title"))
{
heSpan.InnerText = "1.txt";
}
}
Run Code Online (Sandbox Code Playgroud)
执行此代码时,光标在精细输入框中开始闪烁(因为我已设置了heSpan.focus())但文件路径未显示在文件输入框中.如果我实现了heSpan.InvokeMember("click"); 它打开选择一个文件来上传dialoge /弹出窗口,然后我卡住了,因为我不知道如何动态填充弹出窗口然后在文件输入框中插入文件路径.