我最近正在阅读关于async/await的事情,我对以下事实感到困惑:我正在阅读的许多文章/帖子说明在使用异步等待时没有创建新线程(示例).
我创建了一个简单的控制台应用程序来测试它
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);
MainAsync(args).Wait();
Console.WriteLine("Main End: " + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
static async Task MainAsync(string[] args)
{
Console.WriteLine("Main Async: " + Thread.CurrentThread.ManagedThreadId);
await thisIsAsync();
}
private static async Task thisIsAsync()
{
Console.WriteLine("thisIsAsyncStart: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1);
Console.WriteLine("thisIsAsyncEnd: " + Thread.CurrentThread.ManagedThreadId);
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码的输出是:
Main: 8
Main Async: 8
thisIsAsyncStart: 8
thisIsAsyncEnd: 9
Main End: 8
Run Code Online (Sandbox Code Playgroud)
我错过了这一点,或者这个AsyncEnd是否具有与其他操作不同的线程ID?
编辑:
我已根据下面的答案更新了代码await Task.Delay(1)
,但我仍然看到相同的结果.
引用下面的答案:
Rather, it enables the …
Run Code Online (Sandbox Code Playgroud) 有没有办法每隔几秒设置一次篝火重复工作?我不寻求一个解决方案,即火灾和忘记任务会产生另一个火灾和忘记任务,如果没有,建议的替代方案是什么?
有没有办法在序列化期间更改Data属性的名称,所以我可以在WEB Api中重用这个类.
例如,如果我返回分页用户列表,则应将数据属性序列化为"用户",如果我返回项目列表,则应将其称为"项目"等.
这样的事情是可能的:
public class PagedData
{
[JsonProperty(PropertyName = "Set from constructor")]??
public IEnumerable<T> Data { get; private set; }
public int Count { get; private set; }
public int CurrentPage { get; private set; }
public int Offset { get; private set; }
public int RowsPerPage { get; private set; }
public int? PreviousPage { get; private set; }
public int? NextPage { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我想控制这个功能,比如传递名称,如果可能的话.如果我class
被调用UserDTO
,我仍然希望调用序列化属性Users
,而不是UserDTOs
. …
我是DDD的新手,我正试图找出一种通过使用PUT动词来更新聚合的方法.
如果聚合中的所有属性都有私有设置器,那么显然我需要为每个业务需求提供一组功能.举个例子
supportTicket.Resolve();
Run Code Online (Sandbox Code Playgroud)
对我来说很清楚,我可以通过诸如此类的端点实现这一点/api/tickets/5/resolve
,但是如果我想提供一种以原子方式更新整个票据的方法呢?
例如,用户可以/api/tickets/5
使用以下正文发出PUT请求
{"status" : "RESOLVED", "Title":"Some crazy title"}
Run Code Online (Sandbox Code Playgroud)
我是否需要在ApplicationSercvice中执行类似的操作
if(DTO.Status != null && dto.Status == "RESOLVED")
supportTicket.Resolve();
if(DTO.Title != null)
supportTicket.setNewTitle(DTO.title);
Run Code Online (Sandbox Code Playgroud)
如果是这种情况并且更改票证标题有一些业务逻辑以防止在票证解决时更改它,我是否应该在更新聚合时考虑某种优先级,或者我认为这完全错误?
我正在使用.net sdk将消息推送到SNS,然后SNS将消息发布到订阅的SQS队列,但是SNS添加了元数据,例如消息类型等,并且我最终得到了我不想要的更大的JSON负载,尤其是当SQS受到限制时每条消息 256k。
是否可以向 SNS 发送命令并告诉它不要发送该元数据?
这是代码:
var credentials = new StoredProfileAWSCredentials("dev");
using (var client = new AmazonSimpleNotificationServiceClient(credentials, Amazon.RegionEndpoint.EUWest1))
{
var request = new PublishRequest();
request.Message = message;
request.TargetArn = "ARN";
var response = client.Publish(request);
// return response;
}
Run Code Online (Sandbox Code Playgroud)
这是 SNS 推送到 SQS 的内容:
{
"Type":"Notification",
"MessageId":"3333333",
"TopicArn":"ARN",
"Message": {
"Id":45,
"MessageId":"a871f8d7-7091-4548-87c5-da3bb4131044",
"Payload": {
"Internalid":"a7c50558-fc9c-47a6-b0ed-cb0cf5020f55",
"MessageId":"a871f8d7-7091-4548-87c5-da3bb4131044",
"TravelersName":"aaa aaaa",
"TravelersEmail":"aaa@aa.com",
"OwnersEmail":null,
"AccommodationId":1,
"BookingCode":"a523cd07-5506-48ad-9380-2e94002722e0"
},
"EventName":"BookingRecordCreated",
"CreatedOnUtc":"2016-09-26T15:14:55.437",
"HandledOnUtc":null
},
"Timestamp":"2016-09-26T15:14:50.923Z",
"SignatureVersion":"1",
"Signature":"dfgdfg///==",
"SigningCertURL":"https://sns",
"UnsubscribeURL":"https://sns."
}
Run Code Online (Sandbox Code Playgroud)
这就是我发布到 SNS 的内容
"Message":{
"Id":45,
"MessageId":"a871f8d7-7091-4548-87c5-da3bb4131044",
"Payload": …
Run Code Online (Sandbox Code Playgroud) 我正在学习更多关于线程的知识,并使用以下代码创建了一个相当简单的WPF应用程序(x64平台构建)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for (var i = 0; i <= 20000; i++)
{
Thread thread = new Thread(Test);
thread.IsBackground = true;
thread.Start();
}
}
public void Test()
{
Thread.Sleep(20000);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,进程需要大约560MB的RAM,而所有线程都在运行/休眠.
完成后,进程使用率下降到大约125 MB的RAM.
我的问题是,当应用程序本身(没有线程示例)仅使用30 MB的RAM时,为什么进程在此时使用125 MB的RAM?
它是否保留了一些线程以便可能重新使用或正在进行其他操作?
编辑:
由于一些建议如何改进此代码,我想指出我并没有想办法改进它,而是要找出这种行为的原因.
编辑2:
这不是一个与线程相关的,但我string
在内存中尝试了一个包含大列表的情况,并且它没有产生相同的结果.当列表在内存中完全加载时,它占用了大约1.3 GB的内存,但是在列表设置为NULL
并且GC.Collect()
被调用之后,内存使用率按预期降回到30 MB.
码:
public partial class MainWindow : Window
{
List<string> stringArray = new List<string>();
public MainWindow()
{
InitializeComponent();
for (var i = …
Run Code Online (Sandbox Code Playgroud) 在创建聚合时,我们是否应该在聚合中创建值对象,或者我们应该将已创建的值对象传递给ctor或factory.
public Booking(DateTime arrivalDate, DateTime departureDate)
{
this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate);
}
Run Code Online (Sandbox Code Playgroud)
要么
public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo)
{
this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo;
}
Run Code Online (Sandbox Code Playgroud) 我已经开始使用微服务了,我需要创建一个事件发布机制.
我计划使用Amazon SQS.
这个想法很简单.我将事件存储在与聚合相同的事务中的数据库中.如果用户将更改其电子邮件,则事件UserChangedEmail
将存储在数据库中.
我也有事件处理程序,例如UserChangedEmailHandler
,(在这种情况下)将负责将此事件发布到SQS队列,因此其他服务可以知道用户更改了电子邮件.
我的问题是,实现这一目标的做法是什么?我是否应该有某种后台定时进程来扫描事件表并将事件发布到SQS?这可以是WebApi应用程序中的流程(首选),还是应该是一个单独的流程?
其中一个想法是使用Hangfire,但它不支持一分钟内的cron作业.
有什么建议?
编辑:
正如其中一个答案中所建议的,我已经查看了NServicebus.NServiceBus页面上的一个示例显示了我关注的核心.
在他们的示例中,他们创建了一个已放置订单的日志.如果成功提交日志或数据库条目,但发布中断和事件永远不会发布怎么办?
这是事件处理程序的代码:
public class PlaceOrderHandler :
IHandleMessages<PlaceOrder>
{
static ILog log = LogManager.GetLogger<PlaceOrderHandler>();
IBus bus;
public PlaceOrderHandler(IBus bus)
{
this.bus = bus;
}
public void Handle(PlaceOrder message)
{
log.Info($"Order for Product:{message.Product} placed with id: {message.Id}");
log.Info($"Publishing: OrderPlaced for Order Id: {message.Id}");
var orderPlaced = new OrderPlaced
{
OrderId = message.Id
};
bus.Publish(orderPlaced); <!-- my concern
}
}
Run Code Online (Sandbox Code Playgroud) c# asp.net domain-driven-design asp.net-web-api microservices
哪个层应该负责检查数据库中某个实体的存在?假设我有一个订单作为聚合,该订单可以包含多个项目.逻辑意味着我只能添加现有的商品.
我应该在应用程序服务中这样写吗:
var item = ItemRepository.GetByID(id);
//throws exception if the item is null
order.AddItem(item);
Run Code Online (Sandbox Code Playgroud)
要么
//validate item existence inside aggregate function
order.AddItem(item, IItemRepository repo);
Run Code Online (Sandbox Code Playgroud) 我有以下行动
public async Task<ActionResult> Cart(bool refresh = false, bool mobile = false)
{
var user = await Auth.GetUserAsync();
//rest of the code
}
Run Code Online (Sandbox Code Playgroud)
由2个ajax调用同时调用两次(一个用于呈现移动局部,其他正常页面).
$(document).ready(function () {
$("basket").html('<i class="fa fa-spinner fa-spin"></i>');
$('basket').load(PartialURL + "/Cart");
$('MobileBasket').load(PartialURL + "/Cart?mobile=true");
Run Code Online (Sandbox Code Playgroud)
});
真正的问题出现在Auth.GetUserAsync()
功能上.
码:
public static async Task<User> GetUserAsync()
{
if (HttpContext.Current == null || HttpContext.Current.Request == null
|| HttpContext.Current.User == null || HttpContext.Current.Request.IsAuthenticated == false)
return null;
//if session does not exist, but user is logged in, fill session information
if …
Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×2
async-await ×2
amazon-sns ×1
amazon-sqs ×1
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
hangfire ×1
json ×1
json.net ×1