【发布时间】:2016-01-15 09:31:48
【问题描述】:
我是 C#s await/async 的新手,目前正在玩。
在我的场景中,我有一个简单的客户端对象,它具有 WebRequest 属性。客户端应通过WebRequests RequestStream 定期发送活动消息。
这是客户端对象的构造函数:
public Client()
{
_webRequest = WebRequest.Create("some url");
_webRequest.Method = "POST";
IsRunning = true;
// --> how to start the 'async' method (see below)
}
和 async alive-sender 方法
private async void SendAliveMessageAsync()
{
const string keepAliveMessage = "{\"message\": {\"type\": \"keepalive\"}}";
var seconds = 0;
while (IsRunning)
{
if (seconds % 10 == 0)
{
await new StreamWriter(_webRequest.GetRequestStream()).WriteLineAsync(keepAliveMessage);
}
await Task.Delay(1000);
seconds++;
}
}
方法应该如何启动?
新线程(SendAliveMessageAsync).Start();
或
Task.Run(SendAliveMessageAsync); // 改变返回类型为Task
或
等待 SendAliveMessageAsync(); // 失败,因为构造函数不是异步的
我的问题更多是关于我个人对await/async 的理解,我想这在某些方面可能是错误的。
第三个选项是投掷
The 'await' operator can only be used in a method or lambda marked with the 'async' modifier
【问题讨论】:
-
首先你必须决定这是一种即发即弃的方法还是你想等待的东西。
-
这确实是一劳永逸,因为它只需要启动一个
Thread来发送活动消息。 -
那么
await毫无意义,因为您对等待它完成并不真正感兴趣。我会简单地使用线程方法。我个人认为任务是需要异步运行的较小的包含工作单元。 -
你不应该打电话给
new StreamWriter(_webRequest.GetRequestStream()).WriteLineAsync(keepAliveMessage)- await 或其他 - 因为StreamWriter是IDisposable并且必须在使用后妥善处理。此语法不允许您调用.Dipose()。 -
@Enigmativity 好且有效的观点。但这不是工作代码。
StreamWriter也在构造函数中初始化,但为简单起见,此处未显示。
标签: c# asynchronous async-await webrequest