我试图通过创建一个简单的例子来理解async/await的基础知识.我使用Sqlite与Async连接,我有一个这样的类:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说我要保存User到我的UserTable,当保存完成后,我希望检索它.
public async ? SaveToDb()
{
_conn.CreateTableAsync<User>();
await _conn.InsertAsync(new User(){Id=1, Name = "Bill"});
//Code that waits for the save to complete and then retrieves the user
}
Run Code Online (Sandbox Code Playgroud)
我怀疑我需要某个任务,但我不完全确定如何做到这一点.谢谢
我正在看示例方法
public async Task MyMethodAsync()
{
Task<int> longRunningTask = LongRunningOperationAsync();
// independent work which doesn't need the result of LongRunningOperationAsync can be done here
//and now we call await on the task
int result = await longRunningTask;
//use the result
Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)
从How和何时使用`async`和`await`,我有一个关于它是如何工作的问题.
所以,我想说我可以添加一些"独立工作".
public async Task MyMethodAsync()
{
Task<int> longRunningTask = LongRunningOperationAsync();
int millionthPrimeNumber = GetMillionthPrimeNumber();
int result = await longRunningTask;
//use the result
Console.WriteLine(result % millionthPrimeNumber);
}
Run Code Online (Sandbox Code Playgroud)
获得百万分之一的素数是独立的工作,所以我希望它是夹在Task<int> longRunningTask = LongRunningOperationAsync();和之间的东西int result = …
说我有这样的方法:
private async Task SomeMethod()
{
await DoSomethingAsync();
await DoSomethingElseAsync();
return;
}
Run Code Online (Sandbox Code Playgroud)
鉴于DoSomethingElseAsync返回a Task,您似乎应该能够这样做:
private async Task SomeMethod()
{
await DoSomethingAsync();
return DoSomethingElseAsync();
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨这个:
由于'
SomeMethod'是一个返回'Task' 的异步方法,因此返回关键字后面不能跟一个对象表达式.你有意回来'Task<T>'吗?
这是为什么?
我有一种方法可以每秒向我的服务器发送请求。
public async Task StartRequestProcess(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCanecllationRequested)
{
var result = await GetDataFromServerAsync();
await Task.Delay(1000, stoppingToken);
}
}
Run Code Online (Sandbox Code Playgroud)
但我的GetDataFromServerAsync()方法有时需要 10 或 15 秒。
这段时间(10 或 15 秒)有什么作用?
进程会等到完成长请求吗?还是每秒都会发送新请求而无需等待?
本问答旨在明确回答以下问题:
async,await关键字是什么,它们与异步函数有什么关系?要遵循答案,需要以下先决条件:
我正在试验 async-await 并且我遇到了这种相当奇怪的行为,至少对我来说是这样。
我创建了三种模拟长时间运行任务的方法。
考虑两个按钮单击处理程序:
对于 button1_click,经过的时间约为 6000 毫秒,而 button2_click 约为 3000 毫秒。
我无法理解为什么会发生这种情况,即 6000 毫秒与 3000 毫秒。
private async Task<string> TaskOne()
{
await Task.Delay(1000);
return "task one";
}
private async Task<string> TaskTwo()
{
await Task.Delay(2000);
return "task two";
}
private async Task<string> TaskThree()
{
await Task.Delay(3000);
return "task three";
}
//time elapsed = 6000+ms
private async void button1_Click(object sender, EventArgs e)
{
var watch = new Stopwatch();
watch.Start();
await TaskOne();
await TaskTwo();
await TaskThree();
watch.Stop();
textBox3.Text = watch.ElapsedMilliseconds.ToString();
} …Run Code Online (Sandbox Code Playgroud) 最近几天我一直在阅读C# 异步编程。原因是 UWP 中的文件选择器(这是必要的,因为我正在 Unity 中为 Hololens 2 编程)。尽管有很多来源,即1、2、3,但我对正确使用有一些理解问题,也许这里有经验的用户可以给我一些提示。
我正在尝试做的一个例子:
程序开始:
public class SceneUIHandler : MonoBehaviour
{
openFile()
{
pickFile(); // calls await filepicker.PickSingleFileAsync();
loadData(path); // calls FileLoader.loadFile with path from filepicker for the reader
showData(); // should display the data
}
}
Run Code Online (Sandbox Code Playgroud)
装载机:
public class FileLoader:
{
async void loadFile(string path)
{
Task<StreamReader> streamReaderTask = getStreamReader(filePath);
StreamReader sr = await streamReaderTask;
// after that read file with the StreamReader...
...
} …Run Code Online (Sandbox Code Playgroud) 我正在学习异步和等待在编程中如何工作。我在互联网上看到这个例子,说这是异步代码:
class Program
{
static async Task Main(string[] args)
{
Method2();
var count = await Method1();
Method3(count);
Console.ReadKey();
}
static async Task<int> Method1()
{
int count = 0;
await Task.Run(() =>
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(" Method 1");
count += 1;
}
});
return count;
}
static void Method2()
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(" Method 2");
}
}
static void Method3(int count)
{
Console.WriteLine("Total count is …Run Code Online (Sandbox Code Playgroud) 给定方法签名:
(awaitable) Task<Token> ITokenService.GetAPIToken();
Run Code Online (Sandbox Code Playgroud)
在这种方法中发生了await什么?
public async Task<User> GetUser(string userId)
{
Token token = await TokenService.GetAPIToken();
//..........
}
Run Code Online (Sandbox Code Playgroud)
我的理解:GetAPIToken调用并且当前的method(GetUser)返回一个Task<User>对象(稍后会提供一个User对象).只有GetAPIToken方法返回后,当前方法的执行才会继续.
如果我错了,token代码等待GetAPIToken()返回方法时的类型/值是什么?
我知道调用此方法的结果会有所不同,因为它可以使用或不使用await关键字调用.对于帖子,请假设它正在被调用await.
我不明白,我已经看到有提供多种方法的.Net Framework同时具有async和non-async变种。
我的问题是,async给定以下约束,一种方法对我有什么好处:-我将不会Task.Result以同一方法多次提取
-我没有使用CPU-bound任务(Task.Run(...))
我在MVC控制器中,我想处理一个post请求:
[HttPost]
[Route(..)]
public async Task DoSomething(MyModel model)
{
var asyncResult=await NETMethodAsync(model); //PostAsync,WriteAsync....
var nonAsyncResult= NETMethod(model); //Post,Write,....etc..
return result;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将result只在方法中使用一次,而不会多次要求它(哪里await会给我完成的任务结果)有什么区别?我基本上是StateMachine在MethodAsync为什么创建一个?我non-async想我可以更快地进行手术。
如果我没有在另一个方法上委托方法 Task(如下所示),为什么要使用async版本?我问是因为即使MVC Controller默认情况下模板也提供CRUD使用这些async版本的所有操作。
Task tsk=Task.Run(async()=> await MethodAsync() );
Run Code Online (Sandbox Code Playgroud)
PS在我的情况下是我想念的东西。使用async(内部旋转状态机)更快,然后使用非异步版本吗?
async-await ×9
c# ×8
asynchronous ×5
.net ×1
.net-core ×1
asp.net-mvc ×1
es6-promise ×1
hololens ×1
javascript ×1
promise ×1
uwp ×1