我有一个非常简单的ASP.NET MVC 4控制器:
public class HomeController : Controller
{
private const string MY_URL = "http://smthing";
private readonly Task<string> task;
public HomeController() { task = DownloadAsync(); }
public ActionResult Index() { return View(); }
private async Task<string> DownloadAsync()
{
using (WebClient myWebClient = new WebClient())
return await myWebClient.DownloadStringTaskAsync(MY_URL)
.ConfigureAwait(false);
}
}
Run Code Online (Sandbox Code Playgroud)
当我启动项目时,我看到了我的视图,它看起来很好,但是当我更新页面时,我收到以下错误:
[InvalidOperationException:在异步操作仍处于挂起状态时完成异步模块或处理程序.
为什么会这样?我做了几个测试:
task = DownloadAsync();从构造函数中删除并将其放入Index方法中它将正常工作而没有错误.DownloadAsync()身体return await Task.Factory.StartNew(() => { Thread.Sleep(3000); return "Give me an error"; });它将正常工作.为什么不可能WebClient.DownloadStringTaskAsync在控制器的构造函数中使用该方法?
如何清理SQL Server以清除过期的SqlDependency对象?从SqlDepedency对象收到事件后,我需要创建一个新事件才能获得新事件.但是,SQL Server进程的内存使用量会增加,直到超出允许的内存(SQL Server Express).如何摆脱旧查询?
码:
// Func: RegisterTableListener
using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.DatabseEventConnectionString))
{
if (cmd == null)
{
cmd = cn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT HostName, LastStatus, LastDetails, xml FROM dbo.[SystemTable]";
}
lock (cmd)
{
cmd.Connection = cn;
cn.Open();
cmd.Notification = null;
// creates a new dependency for the SqlCommand
if (dep == null)
dep = new SqlDependency(cmd);
// creates an event handler for the notification of data
// changes in …Run Code Online (Sandbox Code Playgroud) 有没有办法将手动创建的表达式树从一个 IQueryable 应用到另一个?例如:
IQueryable<string> p = Enumerable.Empty<string>().AsQueryable();
p = p.Where(pp => pp[0] == 'A');
p = p.Skip(2).Take(4);
p = p.OrderBy(pp => pp.Length);
var vv = new[] {"Afss", "Acv", "Adfv", "Bcvx", "Ng"}.AsQueryable();
// Filtering of the vv collection with expression from p
var filteredResult = vv.Filter(p.Expression);
Run Code Online (Sandbox Code Playgroud)
或者我们必须单独应用Where和OrderBy表达式?
目前我们正在使用服务代理来回发送消息,这是正常的.但我们希望使用RELATED_CONVERSATION_GROUP对这些消息进行分组.我们希望用我们自己的数据库,从我们的数据库坚持UUID作为RELATED_CONVERSATION_GROUP = @uuid,但即使我们使用相同的UUID每次conversion_group_id每次我们收到的排队时间来不同.
你们知道我创建经纪人或接听电话的方式有什么问题,我提供了下面的经纪人创建代码和接收电话代码.谢谢
下面是代码"Service Broker创建代码"
CREATE PROCEDURE dbo.OnDataInserted
@EntityType NVARCHAR(100),
@MessageID BIGINT,
@uuid uniqueidentifier,
@message_body nvarchar(max)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @conversation UNIQUEIDENTIFIER
BEGIN DIALOG CONVERSATION @conversation
FROM SERVICE DataInsertSndService
TO SERVICE 'DataInsertRcvService'
ON CONTRACT DataInsertContract
WITH RELATED_CONVERSATION_GROUP = @uuid;
SEND ON CONVERSATION @conversation
MESSAGE TYPE DataInserted
(CAST(@message_body))
Run Code Online (Sandbox Code Playgroud)
下面是代码"接收代码"
WHILE 0 < @@TRANCOUNT ROLLBACK; SET NOCOUNT ON
BEGIN TRANSACTION;
DECLARE
@cID as uniqueidentifier,
@conversationHandle as uniqueidentifier,
@conversationGroupId as uniqueidentifier,
@tempConversationGroupId as uniqueidentifier,
@message_body VARBINARY(MAX)
RAISERROR ('Awaiting Message ...', …Run Code Online (Sandbox Code Playgroud) 我正在研究sql服务器服务代理作为我们应用程序的消息处理技术。
在我们的方案中,从一个客户端应用程序(WPF)发送的消息需要在服务代理中排队,其他客户端应用程序(android)会接收它们。消息是时间敏感的,接收者需要在消息被发送到队列后的“ X”分钟(例如2分钟)之内接收,如果到那时仍无法接收,则消息必须过期并从接收者中删除。队列。
有没有办法告诉服务代理在“ x”分钟后使消息超时?
编辑:添加了我用来测试此脚本。
CREATE DATABASE ServiceBrokerTest
GO
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
GO
/****** Object: MessageType [SampleMsgType] ***/
CREATE MESSAGE TYPE [SampleMsgType] AUTHORIZATION [dbo] VALIDATION = NONE
GO
/****** Object: ServiceContract [MsgContract] ******/
CREATE CONTRACT [MsgContract] AUTHORIZATION [dbo] ([SampleMsgType] SENT BY INITIATOR)
GO
/****** Object: ServiceQueue [dbo].[Queue1] ******/
CREATE QUEUE [dbo].[Queue1] WITH STATUS = ON , RETENTION = OFF , POISON_MESSAGE_HANDLING (STATUS = ON) ON [PRIMARY]
GO
/****** Object: BrokerService [MsgService] ******/
CREATE …Run Code Online (Sandbox Code Playgroud) c# ×3
sql ×3
sql-server ×2
.net ×1
async-await ×1
database ×1
iqueryable ×1
linq-to-sql ×1
webclient ×1