小编nos*_*tio的帖子

从同步上下文中调用异步方法

我在我的代码中通过HTTP调用服务(最终使用HttpClient.SendAsync方法).然后从WebAPI控制器操作调用此代码.大多数情况下,它工作正常(测试通过),但是当我在IIS上部署时,我遇到死锁,因为异步方法调用的调用者已被阻止,并且继续无法在该线程上继续直到它完成(它不会) .

虽然我可以让我的大多数方法都是异步的,但我觉得我对我何时必须这样做有基本的了解.

例如,假设我确实将我的大部分方法设为异步(因为它们最终调用其他异步服务方法)如果我构建了一个消息循环,我想如何控制程度,那么我将如何调用我的程序的第一个异步方法平行主义?

由于HttpClient没有任何同步方法,如果我有一个不async知道的抽象,我可以安全地假设做什么?我已经读到了这个ConfigureAwait(false)但我真的不明白它的作用.我很奇怪它是在异步调用之后设置的.对我来说,感觉好像一场比赛正在等待......但不太可能......

WebAPI示例:

public HttpResponseMessage Get()
{
  var userContext = contextService.GetUserContext(); // <-- synchronous
  return ...
}

// Some IUserContextService implementation
public IUserContext GetUserContext()
{
  var httpClient = new HttpClient();
  var result = httpClient.GetAsync(...).Result; // <-- I really don't care if this is asynchronous or not
  return new HttpUserContext(result);
}
Run Code Online (Sandbox Code Playgroud)

消息循环示例:

var mq = new MessageQueue();
// we then run say 8 tasks that do this
for (;;)
{
  var m = mq.Get(); …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous async-await

2
推荐指数
1
解决办法
4669
查看次数

HttpContext.Current在MVC4中创建函数异步时为null

我目前正在研究VS2010-SP1中的MVC4.我在控制器类Asynchronous中创建了一个函数.作为其中的一部分,我创建了从AsyncController派生的控制器类,并添加了以下两个方法(请参阅下面的代码部分1和2).一个以Async结尾的方法(参见代码第1节)和另一个以Completed结尾的方法(参见代码第2节).问题出在模型类中我试图使用来自HttpContext的凭据访问我的web服务(参见下面的代码3).进行异步调用时,上下文为空.即,在新的线程中,httpcontext不可用.如何将上下文从主线程传递到创建的新线程.

代码第1节

public void SendPlotDataNewAsync(string fromDate, string toDate, string item)
{

         AsyncManager.OutstandingOperations.Increment();
                    var highChartModel = new HighChartViewModel();
                    Task.Factory.StartNew(() =>
                    {
                          AsyncManager.Parameters["dataPlot"] = 
highChartModel.GetGraphPlotPointsNew(fromDate, toDate, item);
                          AsyncManager.OutstandingOperations.Decrement();
                      });

}
Run Code Online (Sandbox Code Playgroud)

第2节

 public JsonResult SendPlotDataNewCompleted(Dictionary<string, List<ChartData>> 
 dataPlot)
 {
      return Json(new { Data = dataPlot });
 }
Run Code Online (Sandbox Code Playgroud)

第3节

public List<MeterReportData> GetMeterDataPointReading(MeterReadingRequestDto 
meterPlotData)
{

            var client = WcfClient.OpenWebServiceConnection<ReportReadingClient,   
IReportReading>(null, (string)HttpContext.Current.Session["WebserviceCredentials"] ?? 
string.Empty);

                try
                {
                    return 
ReadReportMapper.MeterReportReadMap(client.GetMeterDataPointReading(meterPlotData));
                }
                catch (Exception ex)
                {
                    Log.Error("MetaData Exception:{0},{1},{2},{3}", 
ex.GetType().ToString(), ex.Message, (ex.InnerException != null) ? 
ex.InnerException.Message : String.Empty, " ");
                    throw; …
Run Code Online (Sandbox Code Playgroud)

asynchronous task-parallel-library asp.net-mvc-4

2
推荐指数
1
解决办法
2222
查看次数

在Task.Run或TaskFactory.StartNew仍在工作时更新UI

因此我决定在WPF中重写我的邮件客户端,因为我认为这是我从Windows Forms(我仍然喜欢)的时间,但我面临一些问题.

我BackgroundWorker在我的Windows窗体应用程序中使用了一个东西,并在foreach中worker.ReportProgress(currentProgress);,这使我可以更新UI,因为事情在后台完成,这很棒.

但是刚刚开始一个新的WPF项目后,我注意到BackgroundWorker工具箱中没有(对于WPF应用程序)所以我去网上搜索,发现有些人在使用BackgroundWorkerWPF时更新UI有问题.所以这让我觉得BackgroundWorker在WPF应用程序中使用有点hacky - 而且我不希望这样.

在同一页面上,另一个用户将他们引用到此页面,告诉他们使用Task.Run而不是BackgroundWorker在WPF中.在查看Task.Run文档后,我立即看到它是如何有用的,但我确实有一个问题.我没有看到"报告进度"的方法或者在完成任务时更新UI.我只看到如何运行任务和" await"它; 只留下一个选项 - 在长时间运行的任务完成后更新UI.

当Task.Run/ TaskFactory.StartNew仍在工作时,我们如何更新WPF桌面应用程序的UI ?

.net c# wpf task-parallel-library

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

将 Snowpack 添加到现有 Node 项目时如何指定公共 HTML 文件夹?

将 Snowpack 添加到现有 Node.js 项目时如何指定公共 HTML 文件夹?

我现有的项目结构:

Root
|-src/
|-public/index.html
Run Code Online (Sandbox Code Playgroud)

我添加了雪包:

npm install --save-dev snowpack 
Run Code Online (Sandbox Code Playgroud)

然后在运行 Snowpack 开发服务器时:

npx snowpack dev
Run Code Online (Sandbox Code Playgroud)

我正在No webpage was found for the web address: http://localhost:8080/进入浏览器。

我希望./public/成为 Snowpack 的默认 Web 文件夹,但显然它需要一些配置。

node.js snowpack

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

我从哪里调用异步方法?

我在调用异步方法时遇到了一些麻烦.该方法在类中并加载文本文件.我想在应用程序启动时加载文本文件.但是,我无法从构造函数中调用异步方法.我在网上看过的大多数例子都经常从异步按钮事件中调用方法.

目前,我正在尝试从我的构造函数:

Task.Run(async () =>
{
    this.categories = await GenerateCategories(numberOfCategories);
});
Run Code Online (Sandbox Code Playgroud)

尽管这样可行,但在调用此方法后,程序的其余部分仍会继续,并且使用"类别"执行的代码会导致崩溃(因为类别仍为空,因为任务尚未完成).

总而言之,从哪里以及如何最好地调用此方法?当用户按下按钮或任何东西时,我不希望它加载,我希望在执行任何更多代码之前填充"类别".

我正在使用C#并编写通用应用程序,因此加载文件必须是异步的.

c# file-io async-await windows-runtime win-universal-app

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