作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一些帮助,在Web api服务调用中,我需要在dll中调用一个异步执行的函数,然后在回调函数中给出响应。现在通常这会很好,但是现在有了Web api的想法是执行命令,然后返回响应。
以下是我当前的有效代码,但我认为它的代码很糟糕,它是您不想执行的所有操作。尤其是在Web服务器上,对于每个请求都将运行此代码时。
[HttpGet]
public HttpResponseMessage Off(string id)
{
APNLink.Link link = LinkProvider.getDeviceLink(id, User.Identity.Name);
if (link.LinkConnectionStatus == APNLink.ConnectionStatus.Connected)
{
link.RelayCommand(APNLink.RelayNumber.Relay1, APNLink.RelayCommand.OFF, test);
BlockForResponse();
var msg = Request.CreateResponse(HttpStatusCode.OK);
return msg;
}
else
{
if (link.Connect())
{
var status = link.LinkConnectionStatus;
int timeout = 0;
while (status != APNLink.ConnectionStatus.Connected)
{
Thread.Sleep(500);
status = link.LinkConnectionStatus;
if (status == APNLink.ConnectionStatus.Connected)
{
break;
}
if (timeout++ > 16)
{
var msg1 = Request.CreateResponse(HttpStatusCode.RequestTimeout);
return msg1;
}
}
link.RelayCommand(APNLink.RelayNumber.Relay1, APNLink.RelayCommand.OFF, test);
BlockForResponse();
var msg = Request.CreateResponse(HttpStatusCode.OK);
return msg;
}
else
{
var msg2 = Request.CreateResponse(HttpStatusCode.BadRequest);
return msg2;
}
}
}
bool flag = false;
public void test(bool var)
{
flag = true;
}
private static bool BlockForResponse()
{
int count = 0;
while (!flag)
{
Thread.Sleep(500);
if (count > 10)
{
//timeout
return false;
}
}
return true;
}
最佳答案
回答问题:
In a web api service call, I need to call a function in a dll that executes asynchronously, and then gives the response in a call back function.
TaskCompletionSource
包装DLL的回调。一些不错的附加读物:
TaskCompletionSource<TResult>
。 [HttpGet]
public async Task<HttpResponseMessage> Off(string id)
{
APNLink.Link link = LinkProvider.getDeviceLink(id, User.Identity.Name);
if (link.LinkConnectionStatus == APNLink.ConnectionStatus.Connected)
{
var tcs = new TaskCompletionSource<object>();
CallbackType test = delegate {
tcs.SetResult(null);
};
link.RelayCommand(
APNLink.RelayNumber.Relay1,
APNLink.RelayCommand.OFF,
test);
// BlockForResponse();
await tcs.Task; // non-blocking
var msg = Request.CreateResponse(HttpStatusCode.OK);
return msg;
}
// ...
}
关于c# - 我可以摆脱这个可怕的阻止代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22342967/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!