如果您想使用 Azure,最简单的方法是Windows Azure 移动服务。它允许您在几分钟内使用 Web 界面设置数据库和 Web 服务。
它非常酷,允许您将自定义 javascript 添加到您的 web api 逻辑,并生成 json web api。有适用于 Windows 8、Windows Phone 和 iOS 的客户端库。您可以轻松地为任何启用 http 的前端推出自己的。
但是请注意,采用云路由意味着您的应用程序将无法离线工作,(如果您不编写缓存系统代码。缓存将需要本地数据库。)
关于本地数据库
您确实有以下可能性: 1)您的应用程序中的真实数据库,例如 SQLite。它以Nuget 包的形式提供,但目前 ARM 支持不是开箱即用的,团队也不能保证。如果你不需要手臂,去试试吧:)
2)普通的旧文件存储,就像你以前做的那样。我个人经常这样做。但是,当您从不同的线程访问它时会遇到问题(访问被拒绝错误)。
当您将内容存储在本地文件中时,不要忘记锁定关键部分(即当您读取或写入文件时)以防止访问被拒绝异常。可以肯定的是,将您的写入/读取逻辑封装在您的应用程序中唯一的服务类实例中。(例如使用单例模式,或任何等效的)。
锁本身,现在。我想你正在使用异步等待。我也喜欢这种甜蜜的东西。但是经典的 C# 锁(lock
例如使用关键字)不适用于异步等待。(即使它有效,阻塞也不会很酷)。
这就是奇妙的 AsyncLock 发挥作用的原因。这是一个锁,但它 - 大约 - 不会阻塞(你等待它)。
public class AsyncLock
{
private readonly AsyncSemaphore m_semaphore;
private readonly Task<Releaser> m_releaser;
public AsyncLock()
{
m_semaphore = new AsyncSemaphore(1);
m_releaser = Task.FromResult(new Releaser(this));
}
public Task<Releaser> LockAsync()
{
var wait = m_semaphore.WaitAsync();
return wait.IsCompleted ?
m_releaser :
wait.ContinueWith((_, state) => new Releaser((AsyncLock)state),
this, CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public struct Releaser : IDisposable
{
private readonly AsyncLock m_toRelease;
internal Releaser(AsyncLock toRelease) { m_toRelease = toRelease; }
public void Dispose()
{
if (m_toRelease != null)
m_toRelease.m_semaphore.Release();
}
}
}
public class AsyncSemaphore
{
private readonly static Task s_completed = Task.FromResult(true);
private readonly Queue<TaskCompletionSource<bool>> m_waiters = new Queue<TaskCompletionSource<bool>>();
private int m_currentCount;
public AsyncSemaphore(int initialCount)
{
if (initialCount < 0) throw new ArgumentOutOfRangeException("initialCount");
m_currentCount = initialCount;
}
public Task WaitAsync()
{
lock (m_waiters)
{
if (m_currentCount > 0)
{
--m_currentCount;
return s_completed;
}
else
{
var waiter = new TaskCompletionSource<bool>();
m_waiters.Enqueue(waiter);
return waiter.Task;
}
}
}
public void Release()
{
TaskCompletionSource<bool> toRelease = null;
lock (m_waiters)
{
if (m_waiters.Count > 0)
toRelease = m_waiters.Dequeue();
else
++m_currentCount;
}
if (toRelease != null)
toRelease.SetResult(true);
}
}
你可以这样使用它(我想你有一个名为 blogLock 的 AsyncLock 字段(取自我自己的一个项目):
using (await blogLock.LockAsync())
{
using (var stream = await folder.OpenStreamForReadAsync(_blogFileName))
{
using (var reader = new StreamReader(stream))
{
var json = await reader.ReadToEndAsync();
var blog = await JsonConvert.DeserializeObjectAsync<Blog>(json);
return blog;
}
}
}