- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在学习 HttpClient(通常在 .NET 中使用 API),因此也学习了异步编程。我现在仍然很迷茫,所以试图澄清一些事情。一个我似乎找不到答案的问题 - 异步方法是否仅使用 async 关键字实现?
我知道您可以(理论上)使用异步编程创建同步方法,但您如何识别?例如,来自 this link 和这个例子:
public string GetReleases(string url)
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add(RequestConstants.UserAgent, RequestConstants.UserAgentValue);
var response = httpClient.GetStringAsync(new Uri(url)).Result;
return response;
}
}
For the simplicity’s sake, I implemented it synchronously
public async Task<string> GetReleases(string url)
// GET: Student
public ActionResult Index()
{
IEnumerable<StudentViewModel> students = null;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:64189/api/");
//HTTP GET
var responseTask = client.GetAsync("student");
responseTask.Wait();
var result = responseTask.Result;
if (result.IsSuccessStatusCode)
{
var readTask = result.Content.ReadAsAsync<IList<StudentViewModel>>();
readTask.Wait();
students = readTask.Result;
}
else //web api sent error response
{
//log response status here..
students = Enumerable.Empty<StudentViewModel>();
ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
}
}
return View(students);
}
最佳答案
how can I recognize truely async/sync methods?
void
,你知道的不多。如果是
Task
、
Task<T>
、
ValueTask<T>
或任何其他可等待的 type1,则该方法可能是异步的。但请记住,方法签名可能是固定的,因为该类型从基类继承了该方法,或者它正在实现一个接口(interface);因此,虽然该方法有可能是异步的,但该方法的实际实现可能是完全同步的。
return
await
时,可能是 await
时,如果我们正在
await
ing 的 awaitable 尚未完成,我们只会将控制权返回给 caller4。所以我们必须找出那个可等待的来自哪里,如果它来自调用另一个方法,我们必须重新从头开始考虑该方法的作用。
await
s,那么通常最安全的说法是它可能是异步的 - 但请记住上述关于已经完成的 awaitables 和早期的
return
s 的可能性。
async
/
await
,它还能做什么?好吧,如果它正在使用
Task
s,它可能已经创建了一个或多个这些任务来表示它正在进行的工作。它可能已经安排了更多代码通过 ojit_code 运行。
ContinueWith
s,没有调用其他可能异步的东西,没有导致创建新的
Task
并且没有不必要地混淆,那么它可能是同步的。
Would it be ok to use this in situations where, e.g., I have very simple code and want to avoid threading/deadlock issues, since I'm not comfortable with async programming just yet?
Thread
/
async
相比,问题中示例中显示的同步异步模式更容易出现死锁。为什么?因为它们阻塞当前线程等待其他事情发生。但是它锁定的当前线程或资源可能是特殊的——它被调用的实际异步任务可能需要在它们完成之前获得对相同线程/资源的访问权限。经典的僵局。
await
的可用方法(实例或扩展)返回具有正确形状的类型,则它是可等待的。因此,尽管您可能永远不会看到,但请注意,在该语言中可以自定义等待。
GetAwaiter
/
out
参数。当然,如果它有那些它不会是通过
ref
/
async
关键字实现的异步方法,但它可能仍然有一些异步行为。
await
期间已经将控制权交还给调用者,那么我们不会在稍后的
await
s 将控制权交还给调用者,但我们会将控制权交还给不是我们代码的“某物”。
关于c# - 在 .NET 中,异步方法是专门使用 async 关键字的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54251841/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!