- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在谷歌上搜索了很多,阅读了不同的新手教程,但我认为我不明白正确的做法是什么。基本上,现有的同步代码会在服务器启动并运行时执行某些操作。有时,很少见,服务器需要更长的时间才能启动,所以我想将其包装在一些重试逻辑中。我构建了一个完全愚蠢的控制台应用程序来尝试了解 async 和 await 是如何工作的,并想出了这个:
private static int counter = 0;
static void Main(string[] args)
{
DoIt();
Console.ReadLine();
}
static bool LongTask()
{
if (counter == 2)
{
Console.WriteLine("finally true");
Thread.Sleep(1000);
return true;
}
counter++;
Console.WriteLine("false");
Thread.Sleep(1000);
return false;
}
public static Task<bool> WrapperLongTask()
{
Console.WriteLine("wrapper called");
return Task.Run(() => LongTask());
}
public static async Task DoIt()
{
Console.WriteLine("hi");
var result = await WrapperLongTask();
while (result != true)
{
result = await WrapperLongTask();
Console.WriteLine("inside while loop");
}
Console.WriteLine($"outside while loop {result}");
Console.WriteLine("bye");
}
我的 LongTask 函数代表我当前的函数,该函数通常在第一次运行时运行。然后用
调用此方法是否可以练习Task.Run(() => LongTask())
假设这是“好的”,那么我基本上会在我当前方法 DoWork()
的实际代码中创建它。
Task DoWorkAsync(....) {
return Task.Run(() => DoWork()
}
基本上只是将其包装在 Task.Run 中,将返回类型更改为 Task。然后当我稍后调用这个方法时,我会做类似的事情
var x = await DoWorkAsync;
// do more stuff with x
这样我应该将以前的同步方法转换为异步吗?
DoWork的伪代码(字符串目录,CancellationToken token)
var files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (var file in files) {
try {
token.ThrowIfCancellationRequested();
var fileName = Path.GetFileName(file);
// check if file already exists on server, if not, upload it
}
catch (Exception exception) {
// error handling
}
}
最佳答案
简短的回答是否定的,您不能简单地通过用 Task.Run
包装操作并使方法返回 Task
来将所有类型的同步代码转换为异步代码。
通常,当所考虑的操作可能调用某些 IO 操作(文件系统读/写、网络或 Web 访问、数据库访问等)时,异步代码是有意义的。
例如,如果您有一个方法可以使用 FileStream.Read
等同步方法从文件中读取一些数据,然后对此类文件的内容进行一些 CPU 处理,那么您可以转换你的方法是异步的,方法是让它调用 FileStream.ReadAsync
而不是异步等待,直到 ReadAsync
使用 await
关键字完成,然后工作关于文件的内容(当然你必须改变返回Task
的方法并且是async
)。
这种情况的好处是没有线程等待 IO 操作完成并且线程很昂贵。
没有线程等待 IO 操作完成的好处在服务器应用程序(如 ASP.NET 网站)中非常重要,在这些应用程序中您期望有大量并发请求。但是,对于简单的应用程序,您可能一开始就不想使用异步代码。
如果您想在多个 CPU 内核上运行多个 CPU 密集型操作,您可以使用 Task.Run
。
例如,如果您有 4 个 CPU 内核,则通过 Task.Run
创建 4 个任务来处理一些数据是有意义的。考虑前面的例子,当你异步等待ReadAsync
完成后,你可以将读取的结果拆分为4个部分(假设数据比较大),通过创建4个任务Task.Run
,每一个都会处理一部分结果。然后,您可以使用 Task.WhenAll
异步等待 4 个任务完成。
关于c# - 将同步方法更改为异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645667/
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章详解dedecms后台编辑器将回车 改为 的方法由作者收集整理,如果你对
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
不是将代码放在正文的头部或末尾(我把它放在正文的末尾),如果我将代码放在 JS 文件中而不是在 html 中它自己的脚本标记,是否可以? (我假设它像任何其他代码一样工作正常,但我问以防万一) 最佳答
我尝试执行从\e 命令编写的查询,但现在我无法执行任何查询,但可以在 PSQL 中执行命令。 现在我注意到这一点,我输入的命令现在在\e 中。 当我关闭\e(尝试运行它)时问题开始了。 最佳答案 ps
我有一个这样的字符串($ 字符总是被其他字符包围): a$b c$d e$f 我希望我的字符串方法在 $ 前面放置一个 \ 并删除换行符: a\$bc\$de\$f 我试过了,但它没有放入 \ 字符:
我需要使用 Java 构建一个 XML 文件。问题是我必须使用一些特殊字符,例如“ć”,然后在我的移动应用程序中读取它。 如果我手动更改 ć 就可以正常工作至 ć在我的 XML 文件中的记事
我有一个removeUser 页面,我在其中使用,然后使用submitForm() 函数进行错误处理。这段代码运行得非常好: export default function RemoveUserPag
我在数据库 “2048-05-21” 中有一个看起来像这样的日期 我只想得到年份,在这一年我只想得到两个后面的数字并将两个前面的数字更改为19 example: data : 2048-05-21 1
public class Venus1 { public static void main(String args[]) { int[]x={1,2,3};
我有以下 PHP 脚本,现在我需要在 JavaScript 中做同样的事情。 JavaScript 中是否有类似于 PHP 函数的函数,我已经搜索了好几天但找不到类似的东西?我想做的是计算某个单词在数
这个问题在这里已经有了答案: Is it bad practice to specify an array size using a variable instead of `#define` in
我陷入了一种情况,我必须通过“选中”工具栏中的复选框来“选中”列表中存在的所有复选框。 这是创建复选框列表的代码:- itemTpl: 'checked="checked" /> {groupName
我正在使用Python3。在分析一些网站时,我遇到了一些奇怪的字符并寻找解决方案。我找到了一个,但在找到解决方案之前,我尝试了一些方法,并且知道我无法重置它。当我使用 Jupyter 笔记本将列表 l
我在 http 下有 unity android app 和 site api 的工作基础设施。 最近换了服务器,申请了ssl证书。现在我的 api 在 https 下。 在 unity 应用程序中,
我在 http 下有 unity android app 和 site api 的工作基础设施。 最近换了服务器,申请了ssl证书。现在我的 api 在 https 下。 在 unity 应用程序中,
我在 Objective-C 中有一些代码。我想,我收到了 NSString 类型,但是当我尝试将它保存在核心数据中时,我得到了一个 user.clientID = clientID; 错误,例如:
在表中我有一个名为 CallTime 的字段 (Varchar)。 包括晚上8:00、晚上8:40、上午10:00等时间 我想将字段类型更改为“时间”并更新时间格式。该怎么做? 谢谢 最佳答案 UPD
这个问题在这里已经有了答案: C# - for Loop Freezes at strange intervals (3 个答案) 关闭 6 年前。 我试图解决 problem #14 from P
我今天在 Pycharm 社区版 5.0.3 中收到了这个错误,想知道这是否只是我做错了/没有意识到,或者是 PyCharm lint 问题。重现错误的代码是 mylist = list() # fi
我的目标是将数据库中的随机文本显示到网页上。首先,我不知道为什么我的数据没有保存,为什么我得到的是[Entity of type sec.helloweb.HelloMessage with id:
我是一名优秀的程序员,十分优秀!