我已经创建了一小段代码来并行运行多个异步操作(Parallel
该类本身不适合异步操作).
它看起来像这样:
public static async Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
var chunks = source.Chunk(dop);
foreach (var chunk in chunks)
await Task.WhenAll(chunk.Select(async s => await body(s).ContinueWith(t => ThrowError(t))));
}
private static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize)
{
while (source.Any())
{
yield return source.Take(chunksize);
source = source.Skip(chunksize);
}
}
private static void ThrowError(Task t)
{
if (t.IsFaulted)
{
if (t.Exception.InnerExceptions != null && t.Exception.InnerExceptions.Count == 1)
throw t.Exception.InnerExceptions[0];
else
throw t.Exception;
}
}
Run Code Online (Sandbox Code Playgroud)
就并行运行任务而言,上述代码运行良好.但是,在抛出异常时,我会遇到一些问题. …
我的任务是为应用程序创建一个新模块,因此,我正在为项目添加新的DLL.这一切都很好.
但是,在我的DLL中,我想使用新版本的外部DLL(我无法控制).如果我只引用新的DLL并仅使用该DLL,我的代码将起作用,但旧代码将停止运行.
Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral,
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRESULT:
0x80131040)
Run Code Online (Sandbox Code Playgroud)
我尝试过一个改变DLL名称的简单技巧,但这显然对我来说太天真了,认为它会起作用.我尝试使用外部别名(通过在我的引用中定义它们),但我仍然不知道如何将两个具有相同名称的文件放入一个BIN文件夹中...
我该怎么办?
这是我注意到的非常奇怪的事情.
我正在编写CRM 2011 Silverlight扩展,而且,在我的本地开发实例上一切正常.该应用程序使用OData进行通信,并使用System.Threading.Tasks.Task
很多来在后台执行所有操作(FromAsync
是一种祝福).
但是,我决定在CRM 2011 Online中测试我的应用程序,并且令我惊讶地发现它将不再起作用; 结束检索任务时,我会收到安全异常.
使用Fiddler,我发现CRM正试图将我重定向到Live登录页面,考虑到我已经登录,这个页面没有多大意义.
经过多次尝试后,我发现错误是因为我从与UI线程不同的线程访问该服务.
这是一个简单的例子:
//this will work
private void button1_Click(object sender, RoutedEventArgs e)
{
var query = ctx.AccountSet;
query.BeginExecute((result) =>
{
textBox1.Text = query.EndExecute(result).First().Name;
}, null);
}
//this will fail
private void button2_Click(object sender, RoutedEventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(RestAsync);
}
void RestAsync()
{
var query = ctx.AccountSet;
var async = query.BeginExecute(null, null);
var task = System.Threading.Tasks.Task.Factory.FromAsync<Account>(async, (result) =>
{
return query.EndExecute(result).First(); // <- Exception thrown here
});
textBox1.Dispatcher.BeginInvoke(() =>
{ …
Run Code Online (Sandbox Code Playgroud) c# multithreading task-parallel-library silverlight-5.0 dynamics-crm-2011
这是我的问题.定义订单的类有一个名为的属性PaymentStatus
,其enum
定义如下:
public enum PaymentStatuses : int
{
OnDelivery = 1,
Paid = 2,
Processed = 3,
Cleared = 4
}
Run Code Online (Sandbox Code Playgroud)
后来,在类本身中,属性定义非常简单:
public PaymentStatuses? PaymentStatus { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将订单保存到Azure表存储,则会出现以下异常:
System.InvalidOperationException: The type Order+PaymentStatuses' has no settable properties.
Run Code Online (Sandbox Code Playgroud)
在这一点上,我认为使用enum
是不可能的,但快速谷歌搜索返回此:http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/7eb1a2ca-6c1b-4440-b40e-012db98ccb0a
此页面列出了两个答案,其中一个似乎忽略了这些问题,并建议enum
在Azure存储中使用它很好.
现在,我不需要存储enum
在Azure表存储中,我也可以存储相应的int
,但是,我确实需要在WCF服务中公开此属性.
我已尝试使用属性get
并从存储中set
返回,并通过使用我的事件从Azure中删除此属性,但我在触发此实体的事件之前得到该异常.enum
integer
WritingEntity
DataContext
在这一点上,我不知所措,我不知道我还能做些什么才能在WCF中拥有这个属性enum
,但是Azure存储只是int
.
在WinRT中没有FileInfo
类,只有一个StorageFile
类.
如何使用StorageFile
该类获取文件的大小?
我创建了一个 .nuspec 文件,其中打包了一堆 .proto 文件以便在项目之间共享。这很棒。不幸的是,对于要构建的 .proto 文件,需要将它们实际复制到项目目录,而不仅仅是引用。请注意,这是一个 .NET Core 项目。
现在,我的定义创建了一个包,在使用时引用项目中的文件,但这些文件仍然驻留在原始的 .Nuget 文件夹中,而这并不是我真正需要的。
这是我现在得到的 .nuspec 定义:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>GRPCProtoFiles</id>
<version>1.0.0</version>
<authors>Author</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>.proto files NuGet package.</description>
<dependencies>
<dependency id="Google.Protobuf" version="3.14.0"/>
<dependency id="Grpc" version="2.35.0"/>
</dependencies>
<contentFiles>
<files include="any/any/Protos/**/*.proto" buildAction="None" copyToOutput="false" />
</contentFiles>
</metadata>
<files>
<file src="**\*.proto" target="contentFiles\any\any\Protos" exclude="google\**" />
</files>
</package>
Run Code Online (Sandbox Code Playgroud)
我知道“构建操作”当前设置为“无”,但是一旦文件在软件包安装后进入正确的文件夹,我就可以修复该问题。事实上,如果我尝试将 proto 文件的构建操作设置为正确的操作(即 Protobuf 编译器),则会收到错误,因为这些文件不在它们应该在的位置。
我究竟做错了什么?
编辑:
好的,我已经阅读了一些可能发生的情况及其原因。具体来说,这个答案给了我很多见解。然而,我想知道如何才能真正做我需要做的事情。现在看来,我想要用 NuGet 做的事情是不可能的,而且我使用了错误的工具来完成这项工作。但除了这一限制之外,NuGet 似乎很理想 - 它能够仅从源项目中选取 .proto 文件并发布该文件,而不是为各种目标系统预构建库。
我可能可以添加预构建操作以将文件复制到项目目录,但我不知道如何引用源 NuGet 包文件夹(尤其是版本更改时)。知道这个问题是否有解决方案吗?
我在将本地化附属程序集合并到CRM2011的插件DLL中时遇到了一些麻烦.
要么是,要么我不知道如何使用合并后的资源.
我创建了一些插件并创建了一个基本资源文件(默认 - 英语)和一个特定文化(在编写波兰语本地化时,但后来我还需要添加法语).
我确保不要对组件本身进行签名,因为ILMerge将签署完成的组件本身.
这是我用来合并额外附属程序集的命令:
ilmerge /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt /keyfile:KeyFile.snk /out:Plugins.dll DynamicsCRM2011.Plugins.dll pl-PL\DynamicsCRM2011.Plugins.resources.dll
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,插件是在.NET 4.0中,我已经获得了ILMerge所需的.config文件,以便使用所需的程序集进行合并.
生成的文件显示正常,我可以使用CRM插件管理员注册,添加新步骤等等.
但是,它将始终使用默认语言.我试过改变了System.Threading.Thread.CurrentThread.UICulture
,但这没有用.当我创建一个ResourceManager
类并使用时GetString("ErrorMessage", new System.Globalization.CultureInfo("pl-PL"))
,我得到Exception
了指定的ResourceManager
不知道如何处理指定的文化.
我在这里知道这个问题.但是,发布的解决方案似乎是一个旧的解决方案.生成的资源.cs文件不使用ComponentResourceManager
.此外,在那里发布的部分代码已被标记为已弃用.
我不确定我现在要做什么,或者如何进一步调试这个,因为我在处理程序集本身方面经验很少.请帮助我控制那些卫星组件.
更新:
我一直在使用沙盒插件一段时间了,因此我不再能够访问诸如此类的东西CurrentCulture
(或者至少我无法改变这些东西).我已经尝试再次解决这个问题:我创建了一个简单的插件,在保存新帐户时会触发该插件.没有什么花哨.这是实际的插件代码:
ResourceManager rm = new ResourceManager(typeof(Properties.Resources));
var s = rm.GetString("ErrorAlreadyPosted", new System.Globalization.CultureInfo("pl-PL"));
throw new InvalidPluginExecutionException(s);
Run Code Online (Sandbox Code Playgroud)
该代码不再抛出有关无法找到指定的文化......也是很明显的代码抛出一个最后的异常的异常,但重要的是什么异常消息.我希望它是波兰语.
唉,事实并非如此.返回的字符串GetString
仍然是英文.
我用于ILmerge的命令与之前相同,但是/lib
指定了参数,以便我不必复制所有CRM SDK dll ...
这是我正在努力解决的简化案例:
public bool CompareStruct<S>(S a, S b) where S : struct
{
return a == b;
}
Run Code Online (Sandbox Code Playgroud)
以上不会编译错误Operator '==' cannot be applied to operands of type 'S' and 'S'
。
通常情况下,我不会感到惊讶。但我已经指出那S
是一个结构体——那么为什么我不能比较这两个参数呢?
我不认为这个 SO 问题在这里有任何相关性 - 毕竟,我正在使用struct
类型,而不是引用类型。
这是令我印象深刻的事情,我想知道这是否可能.
长话短说 - 这是代码:
public class NotificationCollection : ObservableCollection<Notification>
{
public NotificationCollection() : base()
{
this.CollectionChanged += NotificationCollection_CollectionChanged;
this.PropertyChanged += NotificationCollection_PropertyChanged;
}
public NotificationCollection(IEnumerable<Notification> items)
: base(items)
{
this.CollectionChanged += NotificationCollection_CollectionChanged;
this.PropertyChanged += NotificationCollection_PropertyChanged;
}
(....)
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在复制代码.如果我没有创建一个继承的类,我会写
public NotificationCollection(IEnumerable<Notification> items)
: this() //I can just call the empty constructor
{
//do stuff here...
//however, in case of inheritance this would be handled by base(items)
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是 - 我可以同时调用base
类构造函数和this
构造函数吗?
由于建议的方式在MS CRM中存储插件是通过CRM数据库,我认为现在是时候对我正在使用的方法做一些事情,即将磁盘存储在磁盘上.
但问题是我不知道如何嵌入DLL所需的所有其他各种位:本地化资源文件(保存在另一个文件夹中)和一些引用的DLL来自最新的SDK(必须是手动放在bin\assembly文件夹中).在这一点上,我甚至不完全确定这是可能的.
到目前为止,我已经尝试通过将资源文件上的构建操作更改为"内容"或"资源"来解决本地化问题,并测试了此解决方案(仍保留磁盘上的位置,但没有添加本地化文件夹).这不起作用:当我故意在其中一个插件中生成验证错误时,尽管在CRM中选择了不同的语言,但我得到了默认语言消息(英语).
在尝试添加一些引用的DLL文件(即新的SDK DLL:xrm.portal,xrm.portal.files和xrm.client)时,我遇到了类似的问题.当我试图将插件存储在数据库中时(跳过本地化问题),我得到一个CRM错误,说它无法找到XRM.Client程序集或其中一个依赖项.我知道我可以使用ILMerge将整个事情放在一起,但我有一种直觉,告诉我这不是一个好主意.
关于这个问题的任何提示或建议都会很棒.
我正在尝试使用EWS找到一种方法来列出日历项集的所有扩展属性.
问题是我设法在网上找到的所有例子都要求我事先知道这些扩展属性是什么.这是MSDN的官方示例.
如果我不知道扩展属性的ID或名称,我该怎么办?或者,如果我甚至不知道是否存在任何扩展属性?
我尝试了以下代码,但它返回一个异常......
var calendarItems = service.FindAppointments(WellKnownFolderName.Calendar, view);
var propertySet = new PropertySet(AppointmentSchema.ExtendedProperties);
service.LoadPropertiesForItems(calendarItems, propertySet);
Run Code Online (Sandbox Code Playgroud)
这是例外:
Microsoft.Exchange.WebServices.Data.ServiceResponseException: The request failed schema validation: The required attribute 'FieldURI' is missing.
可以说我有一个通用接口IFace<T, U>
.该T
和U
可以在一些附加的方式进行约束,但我不认为这是相关的问题.
我想创建一个GenClass
具有以下定义的新泛型类:
class GenClass<T> where T: IFace
即我想告诉编译器GenClass
应该处理任何实现IFace
而不指定泛型类型.
这是可能的,还是我需要指定T
和U
通用参数?
我已经尝试过编写IFace
以及IFace<>
或者IFace<,>
,但是编译器总是适合 - 所以我认为这不可能完成.不过,也许我会以错误的方式解决这个问题?
c# ×9
generics ×2
.net-4.0 ×1
.net-core ×1
async-await ×1
azure ×1
constructor ×1
dynamics-crm ×1
enums ×1
filesize ×1
ilmerge ×1
inheritance ×1
localization ×1
nuget ×1
nuspec ×1
plugins ×1
reference ×1
wcf ×1
winrt-async ×1