从我的理解主要事情之一async
和await
要做的就是让代码易于读写-但使用它们等于产卵后台线程来执行持续时间长的逻辑?
我正在尝试最基本的例子.我在内联添加了一些评论.你能为我澄清一下吗?
// I don't understand why this method must be marked as `async`.
private async void button1_Click(object sender, EventArgs e)
{
Task<int> access = DoSomethingAsync();
// task independent stuff here
// this line is reached after the 5 seconds sleep from
// DoSomethingAsync() method. Shouldn't it be reached immediately?
int a = 1;
// from my understanding the waiting should be done here.
int x = await access;
}
async Task<int> DoSomethingAsync()
{
// is …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从Web API发布一个JsonObject
使用HttpClient
.我不太确定如何解决这个问题,并且在示例代码方面找不到多少内容.
这是我到目前为止所拥有的:
var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";
HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = httpClient.Post("", ???);
Run Code Online (Sandbox Code Playgroud)
我想我需要把我JsonObject
当成一个StreamContent
但是我已经挂了这一步.
微软今天(2010年10月28日)宣布推出Visual Studio Async CTP,它将async
和await
关键字引入C#/ VB以实现异步方法.
首先,我认为编译器将关键字转换为线程的创建,但根据白皮书和Anders Hejlsberg的PDC演示文稿(在31:00),异步操作完全在主线程上发生.
如何在同一个线程上并行执行操作?在技术上如何可能以及在IL中实际翻译的功能是什么?
执行以下操作之间有什么区别:
async Task<T> method(){
var r = await dynamodb.GetItemAsync(...)
return r.Item;
}
Run Code Online (Sandbox Code Playgroud)
VS
async Task<T> method(){
var task = dynamodb.GetItemAsync(...)
return task.Result.Item;
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,由于某种原因,只有第二个工作.第一个似乎永远不会结束.
注意:这个问题是 Unity 特有的。
我读到这async void
是要避免的。 我尝试使用 来执行此操作Result
,但我的应用程序一直锁定。如何避免使用 async void?
public async void PrintNumberWithAwait()
{
int number = await GetNumber();
Debug.Log(number); //Successfully prints "5"
}
public void PrintNumberWithResult()
{
int number = GetNumber().Result;
Debug.Log(number); //Application Freezes
}
private async Task<int> GetNumber()
{
await Task.Delay(1000);
return 5;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的,但我一定错过了一些东西。如何在没有 的情况下使用 async/await async void
?
我使用以下代码单独运行测试(一次注释掉一个):
PrintNumberWithAwait();
PrintNumberWithResult();
Run Code Online (Sandbox Code Playgroud) 我在asp.net core 2.0中将wcf服务端点添加到了连接的服务中,然后尝试使用它,但是对于客户端,只有以..async结尾的功能
我不想使用... async。但是没有.async就没有功能
这有什么问题我该怎么办?
而不是使用
var response = SystemClient.SearchCountriesAsync(....
Run Code Online (Sandbox Code Playgroud)
我想用那个
var response = SystemClient.SearchCountries(...
Run Code Online (Sandbox Code Playgroud)
但它给那个错误
错误CS1061'SystemClient'不包含'SearchCountries'的定义,并且找不到扩展方法'SearchCountries'接受类型为'SystemClient'的第一个参数(您是否缺少using指令或程序集引用?)
我有与此非常相似的代码(我稍微简化了代码以演示我试图弄清楚的行为的本质)。
public async System.Threading.Tasks.Task<bool> IsNumberOdd(int numToTest)
{
if (numToTest % 2 == 0)
{
return false;
}
else
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用async
关键字,我会收到关于无法将 abool
转换为a 的抱怨Task<bool>
。我假设这里涉及一些语法糖。查看 IL(我对 IL 不太熟悉)似乎 async 关键字导致任务运行,然后返回值是任务的结果。我理解正确吗?
顺便说一句,如果这是一个骗局,或者如果有一些博客文章讨论了这个问题,请随时指出并关闭它。我不是想给我的代表打气;我试图了解这段代码发生了什么。
编辑:
对于那些问“为什么这个方法是异步的?”的人——因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码的示例,但我试图使代码尽可能小而简单。
c# ×6
async-await ×5
asynchronous ×5
.net ×2
asp.net ×2
wcf ×2
.net-core ×1
task ×1
vb.net ×1
wcf-web-api ×1