小编Dan*_*bio的帖子

处理来自异步并行任务的多个异常

问题

有几个任务是并行运行的,all,none或者其中任何一个都可能抛出异常.当所有任务完成后,必须报告所有可能发生的异常(通过日志,电子邮件,控制台输出......等等).

预期的行为

我可以通过linq和async lambdas构建所有任务,然后等待它们并行运行Task.WhenAll(tasks).然后我可以抓住AggregateException并报告每个内部异常.

实际行为

一个AggregateException被抛出,但它仅包含一个内部异常,无论个别例外的数量已经抛出.

最小的完整可验证的例子

static void Main(string[] args)
{
    try
    {
        ThrowSeveralExceptionsAsync(5).Wait();
    }
    catch (AggregateException ex)
    {
        ex.Handle(innerEx =>
        {
            Console.WriteLine($"\"{innerEx.Message}\" was thrown");
            return true;
        });
    }

    Console.ReadLine();
}

private static async Task ThrowSeveralExceptionsAsync(int nExceptions)
{
    var tasks = Enumerable.Range(0, nExceptions)
        .Select(async n =>
        {
            await ThrowAsync(new Exception($"Exception #{n}"));
        });

    await Task.WhenAll(tasks);
}

private static async Task ThrowAsync(Exception ex)
{
    await Task.Run(() => {
        Console.WriteLine($"I am going to throw \"{ex.Message}\""); …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing exception-handling async-await

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

保证c#的不变性

在阅读了很多关于C#的不变性并且理解它的好处(没有副作用,安全字典键,多线程......)后,我想到了一个问题:

为什么在C#中没有关键字断言类(或结构)是不可变的?此关键字应在编译时检查您是否无法改变类(或结构).例如:

public immutable class MyImmutableClass
{
    public readonly string field;

    public string field2; //This would be a compile time error

    public readonly AnyMutableType field3; //This would be a compile time error


    public string Prop { get; }

    public string Prop2 { get; set; } //This would be a compile time error

    public AnyMutableType Prop3 { get; } //This would be a compile time error
}
Run Code Online (Sandbox Code Playgroud)

我认为编译器的工作非常简单,因为它需要检查一些事情:

  • 所有公共领域都是只读的.
  • 所有公共场所都只有吸气剂.
  • 所有公共字段或属性也具有不可变类型(简单值类型或不可变类/结构).
  • 所有公共函数或公共属性getter仅依赖于不可变字段或属性(如前所述的公共字段/ props,或符合相同限制的私有字段/ props).这当然包括Equals(),GetHashCode()和ToString().

这个设计让我想到了一些可能的问题:

  • 为了使编译器知道编译的类/结构是不可变的,可能需要在中间语言中进行更改.
  • 只读通用集合(例如IEnumerable<T>)不变性取决于类型的不变性<T>.建议的 …

c# immutability

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

从字节(在内存中使用任意编码的文本)在内存中创建zip文件

我正在开发的应用程序需要将xml文件压缩为zip文件,并通过http请求将其发送到Web服务。因为我不需要保留zip文件,所以我只是在内存中执行压缩。Web服务拒绝了我的请求,因为zip文件显然格式错误。

我知道此问题中有一个解决方案可以很好地工作,但它使用了StreamWriter。该解决方案的我的问题是,StreamWriter需要编码或假设UTF-8,并且我不需要知道xml文件的编码。我只需要从这些文件中读取字节,然后将它们存储在zip文件中,无论它们使用哪种编码即可。

因此,很明显,这个问题与编码无关,因为我不需要将字节转换为文本或相反。我只需要压缩一个byte[]

我正在使用下一个代码来测试zip文件的格式是否错误:

static void Main(string[] args)
{
    Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

    string xmlDeclaration = "<?xml version=\"1.0\" encoding=\"" + encoding.WebName.ToUpperInvariant() + "\"?>";
    string xmlBody = "<Test>ª!\"·$%/()=?¿\\|@#~€¬'¡º</Test>";
    string xmlContent = xmlDeclaration + xmlBody;
    byte[] bytes = encoding.GetBytes(xmlContent);
    string fileName = "test.xml";
    string zipPath = @"C:\Users\dgarcia\test.zip";

    Test(bytes, fileName, zipPath);
}

static void Test(byte[] bytes, string fileName, string zipPath)
{
    byte[] zipBytes;

    using (var memoryStream = new MemoryStream())
    using (var zipArchive = …
Run Code Online (Sandbox Code Playgroud)

c# compression zip

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