雖然我的問題是關於Cassandra,但是如何最好地使用異步API,我將行插入到Cassandra中。簡而言之,我爲C#代碼中的一行生成一個id,並異步執行插入操作,並希望將該id返回給調用者。下面的示例代碼顯示了我到目前爲止所嘗試的,所有這些工作,但哪個最好?有替代品或更好的解決方案嗎?如何最好的將異步任務返回給調用者
說我有一些班級和所有的Cassandra gubbins成立。這同樣可以是我正在序列化該類的文件;這不是卡桑德拉的問題。
class MyClass
{
public Guid Id { get; set; }
public string Text { get; set; }
}
ISession cassandraSession;
PreparedStatement preparedStatement;
我第一次嘗試是使用async+await
async Task<Guid> Insert(MyClass someObject)
{
someObject.Id = TimeUuid.NewId();
BoundStatement insert = preparedStatement.Bind(someObject.Id, someObject.Text);
await cassandraSession.ExecuteAsync(insert);
return someObject.Id;
}
經過一番研究,我爲這種認識是次優的,因爲它會阻止對await
和創造一個全新的狀態機等
接下來,我想這:
Task<Guid> Insert(MyClass someObject)
{
someObject.Id = TimeUuid.NewId();
BoundStatement insert = preparedStatement.Bind(someObject.Id, someObject.Text);
cassandraSession.ExecuteAsync(insert);
return Task.FromResult(someObject.Id);
}
硒EMS是好的,沒有阻塞,但是調用者可以在插入完成之前收到ID和查詢,但沒有找到該行?我嘗試了延續:
Task<Guid> Insert(MyClass someObject)
{
someObject.Id = TimeUuid.NewId();
BoundStatement insert = preparedStatement.Bind(someObject.Id, someObject.Text);
return cassandraSession
.ExecuteAsync(insert)
.ContinueWith(t => someObject.Id);
}
這也似乎工作,意味着調用者等待將包括插入的任務,所以應確保插入都將完成。
我有遺漏或誤解任何東西嗎?
你說:「我的理解是這是次優的,因爲它會阻止等待」。這不是真的。你真的測試過這個看看它是否阻塞了嗎? –
你如何使用'Insert'方法? 「Insert」方法的調用者是異步的嗎? –
你的中間一個看起來很糟糕 - 'ExecuteAsync'返回的是可以等待的東西,但你忽略了它。 –