C# 检查是从void方法完成的,不可能返回
我正在尝试了解C# 检查是从void方法完成的,不可能返回,c#,async-await,C#,Async Await,我正在尝试了解async和wait我一直在尝试在我的一些代码中实现它,到目前为止我已经做了: 代码: public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project) { try { string macroSelected = _macroModeT
async
和wait
我一直在尝试在我的一些代码中实现它,到目前为止我已经做了:
代码:
public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project)
{
try {
string macroSelected = _macroModeToUse == "-[REG]" ? "-[REG]" : "-[LAP]";
if (_macroModeToUse == macroSelected)
{
foreach (string _macroCodeFile in _macroCode)
{
string[] code = _macroCodeFile.Split('|');
switch (code[0])
{
case "RJ_U":
string cleanUrl = code[1].Replace("{HOSTNAME}", _site);
browser.Load(cleanUrl);
panelBrowserMain.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
browserMain.Text = cleanUrl;
browser.AddressChanged += Browser_AddressChanged;
break;
case "RJ_I":
//await Task.Run(() => {
// return browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
//});
browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
break;
}
}
}
}
catch (Exception ex)
{
Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
}
public async Task InitializeChromeBrowserAsync(ChromiumWebBrowser browser, string _macroModeToUse, string[] _macroCode, string _site, int _sitesCount, Project _project, Func<string, Tuple<string, string, string>> getUserPassEmail)
{
try
{
Task newTask = await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
if (newTask.IsCompleted)
{
this.Close();
}
}
catch (Exception ex)
{
Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
}
public async Task ExcecuteMacroCode(string\u macromodeouse,string[]\u macroCode,string\u site,Project\u Project)
{
试一试{
字符串宏选择=_macroModeToUse==“-[REG]”?“-[REG]”:“-[LAP]”;
如果(_macroModeToUse==选择的宏)
{
foreach(字符串\u宏代码中的宏代码文件)
{
string[]code=_macroCodeFile.Split(“|”);
开关(代码[0])
{
案例“RJ_”:
字符串cleanUrl=代码[1]。替换(“{HOSTNAME}”,_站点);
browser.Load(cleanUrl);
panelBrowserMain.Controls.Add(浏览器);
browser.Dock=DockStyle.Fill;
Text=cleanUrl;
browser.AddressChanged+=浏览器\地址已更改;
打破
案例“RJ_I”:
//等待任务。运行(()=>{
//返回browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(代码[1],_项目));
//});
ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(代码[1],_项目));
打破
}
}
}
}
捕获(例外情况除外)
{
DebugLogging($“[{DateTime.Now}]-[{ex}]”;
}
}
公共异步任务初始化RomeBrowserAsync(ChromiumWebBrowser浏览器、字符串_Macromodeouse、字符串【】宏代码、字符串_站点、int _站点、项目_项目、Func getUserPassEmail)
{
尝试
{
Task newTask=wait ExcecuteMacroCode(\u宏模式,\u宏代码,\u站点,\u项目);
如果(newTask.IsCompleted)
{
这个。关闭();
}
}
捕获(例外情况除外)
{
DebugLogging($“[{DateTime.Now}]-[{ex}]”;
}
}
我刚才设置它的方式得到了错误无法将类型'void'隐式转换为'System.Threading.Tasks.Task'
,据我所知,这是因为方法wait ExcecuteMacroCode
没有返回任何内容(没错,我真的不需要返回任何内容)
有什么方法可以确保任务完成,这样我就可以使用
新任务。IsCompleted
部分,我甚至不确定我是否正确设置了代码。希望您能提供帮助。您无需手动检查等待的任务是否完成。等待接线员已经完成了
错误是此调用正在等待\u wellboreService.CreateWellboreSectionAsync(wellboreSection,CurrentUser)
返回void
,您正试图将其分配给任务newTask
当您等待任务时,该方法将挂起,并将控制权交给父调用方,直到任务完成,然后自动恢复。在await语句之后,您知道任务实际上已经完成,因为如果不完成,您就不会到达执行中的那一行。因此,不需要手动检查任务的IsCompleted
属性。
您可以像这样重写代码:
try
{
await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
this.Close();
}
catch (Exception ex)
{
Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
您应该查看更多说明和示例,例如:
public async Task<int> GetUrlContentLengthAsync()
{
var client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("https://docs.microsoft.com/dotnet");
DoIndependentWork();
string contents = await getStringTask;
return contents.Length;
}
void DoIndependentWork()
{
Console.WriteLine("Working...");
}
公共异步任务GetUrlContentLengthAsync()
{
var client=新的HttpClient();
任务getStringTask=
client.GetStringAsync(“https://docs.microsoft.com/dotnet");
做独立的工作();
字符串内容=等待getStringTask;
返回内容。长度;
}
void DoIndependentWork()
{
控制台。WriteLine(“工作…”);
}
密切注意等待接线员。它挂起GetUrlContentLengthAsync
:
GetUrlContentLengthAsync
在getStringTask
完成了GetUrlContentLengthAsync
getStringTask
已完成wait
操作符检索
字符串结果来自getStringTask
您不需要手动检查等待的任务是否已完成。等待接线员已经完成了 错误是此调用
正在等待\u wellboreService.CreateWellboreSectionAsync(wellboreSection,CurrentUser)
返回void
,您正试图将其分配给任务newTask
当您等待任务时,该方法将挂起,并将控制权交给父调用方,直到任务完成,然后自动恢复。在await语句之后,您知道任务实际上已经完成,因为如果不完成,您就不会到达执行中的那一行。因此,不需要手动检查任务的IsCompleted
属性。
您可以像这样重写代码:
try
{
await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
this.Close();
}
catch (Exception ex)
{
Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
您应该查看更多说明和示例,例如:
public async Task<int> GetUrlContentLengthAsync()
{
var client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("https://docs.microsoft.com/dotnet");
DoIndependentWork();
string contents = await getStringTask;
return contents.Length;
}
void DoIndependentWork()
{
Console.WriteLine("Working...");
}
公共异步任务GetUrlContentLengthAsync()
{
var client=新的HttpClient();
任务getStringTask=
client.GetStringAsync(“https://docs.microsoft.com/dotnet");
做独立的工作();
字符串内容=等待getStringTask;
返回内容。长度;
}
void DoIndependentWork()