对于在类库中公开 API 的同步和异步版本,是否有推荐的最佳实践/指南?例如,如果我在类库中定义了以下 2 个方法:
public Task<string> GetSomeDataAsync()
{
//typically an IO operation that would be awaited on, simplified to return a Task for illustration
return Task<string>.Factory.StartNew( () => "foo");
}
public string GetSomeDataSync()
{
var task = GetSomeDataAsync();
task.ConfigureAwait(continueOnCapturedContext: false);
return task.Result;
}
Run Code Online (Sandbox Code Playgroud)
上面的内容可以托管在 Winform/WPF/Console/ASP.NET 客户端应用程序中。假设任务配置为不捕获任何同步上下文以避免潜在的死锁,客户端使用上面使用 task.Result 的同步版本是否安全
我正在使用Ninject.MVC3和WebAPI.最初,我正在使用这里概述的NinjectResolver和NinjectScope的实现,即使用,我注意到每次调用Controller时都会调用BeginBlock().在对控制器进行负载测试(超过几百次调用)时,我注意到w3wp的内存消耗显着增加(高负载时高达1.4 gigs)并且GC永远不会回收任何内存._kernel.BeginBlock()
根据这篇SO帖子,不应该处理内核并且不应该使用BeginBlock().之后我更新了Resolver和Scope,如下所示:
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
public void Dispose()
{
//Don't dispose the kernel
//IDisposable disposable = (IDisposable)resolutionRoot;
//if …Run Code Online (Sandbox Code Playgroud) 我创建了一个我在工作流程中使用的自定义CRM活动.我将此活动用作自定义工作流活动的InArgument.在Execute()方法中,我试图将自定义CRM活动实例的OwnerId设置为系统用户,并在我使用CrmSvcUtil生成的上下文对象上调用UpdateObject(实体).
[Input("Some name")]
[ReferenceEntity("mycustomactivity")]
[Required]
public InArgument<EntityReference> MyCustomActivity{get;set;}
void Execute(CodeActivityContext context)
{
IOrganizationService svc = context.GetExtension<IOrganizationService>();
var customActivityReference = MyCustomActivity.GetValue(MyCustomActivity);
//MyServiceContext is an OrganizationServiceContext generated using CrmSvcUtil
MyServiceContext servicecontext = new MyServiceContext(svc);
//GetCutomActivityInstance uses the Id to get an instance of the custom activity)
MyCustomCRMActivity activityInstance = GetCutomActivityInstance (servicecontext,customActivityReference.Id);
activityInstance.OwnerId = new EntityReference("systemuser",<SomeGUID>);
context.UpdateObject(activityInstance);
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
以上操作不起作用,活动所有者默认为我的crm用户帐户,并且未更新以反映我在activityInstance.OwnerId中设置的所有者
任何帮助将非常感激.
我在IIS 7.5中设置了一个MSCRM网站,其中我在绑定下配置了以下主机头:1)crm 2)crm.mydomain.com
我正在尝试访问OrganizationData.svc.我已配置将以下内容添加到CRMWeb应用程序的Web.config中
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://crm/"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Run Code Online (Sandbox Code Playgroud)
如果我使用以下URL访问服务,则此方法有效:http://crm/MSCRMDEV/XRMServices/2011/OrganizationData.svc/ 但如果我使用FQDN http://crm.mydomain.com/MSCRMDEV/它不起作用XRMServices/2011/OrganizationData.svc /
我尝试在配置中添加" http://crm.mydomain.com/ "作为另一个前缀,就在我为" http:// crm / " 添加的条目下面,但是WCF会抛出以下错误:
此集合已包含方案http的地址.此集合中每个方案最多只能有一个地址.如果您的服务是在IIS中托管的,则可以通过将'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled'设置为true或指定'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'来解决问题.
我按照这里的建议添加了multiplesitebindings ="true",但这也没有帮助.我也查看了这个消息,但CRM Web应用程序的Web.config中没有节点,所以不确定我是否可以添加此部分
这可以实现吗?从我所看到的WCF有问题使用多个http主机头(在IIS绑定中添加).
WPF是否在一个语句中支持多个绑定表达式?以下内容:
<TextBlock Text="{Binding Path=OrderID} shipped on {Binding Path=OrderDate}"/>
Run Code Online (Sandbox Code Playgroud)
我猜它确实如此,但我认为我没有正确的语法.
有没有办法将工作流中的"发送电子邮件"活动中的电子邮件的"关联"字段设置为工作流的主要实体?
我尝试使用表单助手,但它不允许我将工作流的主要实体绑定到电子邮件的"关注"字段.
有没有办法实现这个目标?