小编Ber*_*nig的帖子

从数据绑定属性设置器中调用异步方法的正确方法?

现在我知道属性不支持异步/等待有充分理由.但有时您需要从属性设置器中启动一些额外的后台处理 - 一个很好的例子是MVVM场景中的数据绑定.

在我的例子中,我有一个绑定到ListView的SelectedItem的属性.当然,我立即将新值设置为支持字段,并完成属性的主要工作.但是,UI中所选项目的更改还需要触发REST服务调用,以根据现在选择的项目获取一些新数据.

所以我需要调用异步方法.显然,我无法等待它,但我也不想激活并忘记呼叫,因为在异步处理期间我可能会错过异常.

现在我的看法如下:

private Feed selectedFeed;
public Feed SelectedFeed
{
    get
    {
        return this.selectedFeed;
    }
    set
    {
        if (this.selectedFeed != value)
        {
            this.selectedFeed = value;
            RaisePropertyChanged();

            Task task = GetFeedArticles(value.Id);

            task.ContinueWith(t =>
                {
                    if (t.Status != TaskStatus.RanToCompletion)
                    {
                        MessengerInstance.Send<string>("Error description", "DisplayErrorNotification");
                    }
                });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,除了事实上我可以将处理从setter转移到同步方法,这是处理这种情况的正确方法吗?有没有更好,更简洁的解决方案,我没有看到?

会非常有兴趣看到其他一些问题.我有点好奇,我无法找到关于这个具体主题的任何其他讨论,因为在MVVM应用程序中,大量使用数据绑定似乎很常见.

mvvm async-await windows-runtime winrt-async

21
推荐指数
1
解决办法
3062
查看次数

从SQL Azure中获取大行 - 但要去哪里?表,Blob或MongoDB之类的东西?

我阅读了Azure Table/Blob/SQL存储之间的大量比较,我想我对所有这些都有很好的理解......但是,我仍然不确定在哪里可以满足我的特定需求.也许某人有类似情景的经验并能够提出建议.

是)我有的

一个SQL Azure数据库,用于在varchar(max)列中的原始HTML中存储文章.每行还有许多元数据列和许多索引,以便于查询.该表包含许多对用户,订阅,标签等的引用 - 因此我的项目将始终需要SQL DB.

有什么问题

我已经在这个表中有大约500,000篇文章,我预计它每年会增加数百万篇文章.每篇文章的HTML内容可以在几KB到1 MB之间,或者在极少数情况下,大于1 MB.

出现了两个问题:由于Azure SQL存储空间很昂贵,而且比以后更早,因此我将自己负责存储这个存储的成本.此外,我还会比以后更早地达到150 GB数据库大小限制.这500,000篇文章现在已占用1.6 GB的数据库空间.

我想要的是

很明显,那些HTML内容必须离开SQL DB.虽然文章表本身必须保留用于将其加入用户,订阅,标签等以便快速关联发现所需文章,但至少保存HTML内容的列可以外包到更便宜的存储.

乍一看,Azure Table存储看起来非常合适

非常便宜的价格和快速查询在一个大表中的数TB的数据 - 听起来很完美,有一个单独的表存储表将文章内容作为SQL DB的附加组件.

但是通过这里的比较显示它甚至可能不是一个选项:对于98%的文章,每列64 KB就足够了,但是对于某些单篇文章,即使整个1 MB的行限制也可能会留下2%还不够.

Blob存储听起来完全错误,但......

所以Azure上只有一个选项:Blob.现在,它可能没有听起来那么错误.在大多数情况下,我一次只需要一篇文章的内容.使用Blob存储时,这应该可以正常工作.

但我也有查询,我需要一次50行,100行甚至更多行,甚至包括内容.因此,我必须运行SQL查询来获取所需的文章,然后从Blob存储中提取每一篇文章.我对此没有任何经验,但我无法相信在执行此操作时我可以保持毫秒级的查询时间.对于我的项目而言,花费多秒的查询是绝对禁止的.

所以它似乎也不是一个合适的解决方案.

我看起来像个有计划的人吗?

至少我有类似计划的东西.我想过只将"适当的记录""导出"到SQL表存储和/或Blob存储中.

像"只要内容<64 KB将其导出到表存储,或者将其保存在SQL表中(甚至将此单个XL记录导出到BLOB存储中)"

这可能足够好了.但它使事情变得复杂,并且可能不容易出错.

那些其他选择

还有一些像MongoDB和CouchDB这样的其他NoSQL DB似乎更符合我的需求(至少从我天真的角度来看,那些刚读过纸上规格的人,我没有经验).但是他们需要自我托管,如果可能的话,有些事我想摆脱它.我在Azure上根据自托管服务器和服务的需要尽可能少地做.

你真的在这儿读过吗?

那么非常感谢你宝贵的时间和思考我的问题:)

任何建议将不胜感激.如你所见,我有自己的想法和计划,但没有什么能比以前走过路上的人有经验:)

谢谢,伯恩哈德

azure mongodb azure-storage-blobs azure-table-storage azure-sql-database

7
推荐指数
2
解决办法
1182
查看次数

添加额外条件时"无加密谓词" - 为什么?

一般来说,我有一个非常简单的查询,并且不明白为什么实际的执行计划在"嵌套循环"节点上的初始选择之后立即向我显示警告"No Join Predicate".

我认为查询是不言自明的:我有用户,他们有UserSubscriptions to Feeds(m:n) - 我想查询用户必须订阅的一个Feed中的所有FeedItems,所以这个查询做得很好:

select fi.Title, fi.Content, fi.Published
from [User] u 
inner join UserSubscription us on u.id = us.UserId
inner join Feed f on f.id = us.FeedId
inner join FeedItem fi on fi.FeedId = f.Id
where u.EMailAddress = 'xxx@xxx.xx'
and f.id = 3
and fi.Inserted > getdate() - 30
Run Code Online (Sandbox Code Playgroud)

有趣的是,只要我忽略这个条件就没有警告:

and f.id = 3
Run Code Online (Sandbox Code Playgroud)

一旦删除它,关于缺少连接谓词的警告就会消失.我不明白这个警告的原因.

任何帮助理解这一点将不胜感激!

谢谢b.

t-sql sql-server

6
推荐指数
1
解决办法
1044
查看次数

使用ASP.NET Web API输出Atom提要

在我的ASP.NET Web API项目中,我有一些标准的Edit API调用,其中XML或JSON输出或者调用者想要的任何内容都可以.但是有些调用应该返回ATOM提要.

现在我发现在这篇文章中我可以通过自定义MediaTypeFormatter实现ATOM或RSS输出:如何使用ASP.NET Web API生成ATOM和RSS2源?

但它实际上并不是我想要的,因为仍然由调用者通过HTTP Accept-header请求这样的输出.我想在这里专门返回ATOM,没有JSON,没有(序列化对象)XML.

是否可以使用Web API执行此操作?或者为这些调用使用标准Web控制器并仅将所有其他API调用实现为ApiControllers会更好吗?

谢谢你的帮助!

asp.net-web-api

0
推荐指数
1
解决办法
2402
查看次数