调用 void async 等于 Task.Run?
Calling void async equals Task.Run?
当我调用一个 returns 无效的异步方法时,它与我用 Task.Run 方法调用它时一样吗?我问是因为在 FileSystemWatcher 的文档中他们提到了以下内容。
Keep your event handling code as short as possible.
所以我想很快离开事件方法的范围。或者它们的意思不同?
为了更好地理解我的代码片段。
private void OnCreated(object sender, FileSystemEventArgs e)
{
RunSaveWithLogger(AddLocation, e.FullPath);
}
private async void RunSaveWithLogger(Func<string, Task> func, string fullPath)
{
编辑:
在阅读了您的回答和评论后,我将代码更改为这样。
private void OnCreated(object sender, FileSystemEventArgs e)
{
Task.Run(() =>
{
RunSaveWithLogger(AddLocation, e.FullPath);
});
}
private async void RunSaveWithLogger(Func<string, Task> func, string fullPath)
{
try
{
await func.Invoke(fullPath);
}
catch (Exception exception)
{
_logger.LogError(exception, "");
}
}
感谢您的宝贵时间和帮助,我真的很感激。
简单回答不!它们不一样。例如,在下面的示例中,“Task.Run”创建一个新线程,因此在新线程中运行其中的所有代码,而“async void”则不会。 (我怀疑这是否是您正在寻找的答案)。
using System;
using System.Threading.Tasks;
class Solution
{
static void Main(string[] args)
{
async void Method1()
{
while (true)
{
}
}
Task.Run(() => {
while (true)
{
}
});
Console.WriteLine("This will print");
Method1();
Console.WriteLine("This won't");
}
}
当我调用一个 returns 无效的异步方法时,它与我用 Task.Run 方法调用它时一样吗?我问是因为在 FileSystemWatcher 的文档中他们提到了以下内容。
Keep your event handling code as short as possible.
所以我想很快离开事件方法的范围。或者它们的意思不同?
为了更好地理解我的代码片段。
private void OnCreated(object sender, FileSystemEventArgs e)
{
RunSaveWithLogger(AddLocation, e.FullPath);
}
private async void RunSaveWithLogger(Func<string, Task> func, string fullPath)
{
编辑:
在阅读了您的回答和评论后,我将代码更改为这样。
private void OnCreated(object sender, FileSystemEventArgs e)
{
Task.Run(() =>
{
RunSaveWithLogger(AddLocation, e.FullPath);
});
}
private async void RunSaveWithLogger(Func<string, Task> func, string fullPath)
{
try
{
await func.Invoke(fullPath);
}
catch (Exception exception)
{
_logger.LogError(exception, "");
}
}
感谢您的宝贵时间和帮助,我真的很感激。
简单回答不!它们不一样。例如,在下面的示例中,“Task.Run”创建一个新线程,因此在新线程中运行其中的所有代码,而“async void”则不会。 (我怀疑这是否是您正在寻找的答案)。
using System;
using System.Threading.Tasks;
class Solution
{
static void Main(string[] args)
{
async void Method1()
{
while (true)
{
}
}
Task.Run(() => {
while (true)
{
}
});
Console.WriteLine("This will print");
Method1();
Console.WriteLine("This won't");
}
}