小编Geo*_*ell的帖子

如何在没有等待的情况下在C#中安全地调用异步方法

我有一个async不返回任何数据的方法:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}
Run Code Online (Sandbox Code Playgroud)

我从另一个返回一些数据的方法调用它:

public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}
Run Code Online (Sandbox Code Playgroud)

MyAsyncMethod()没有等待的情况下进行呼叫会导致" 因为此呼叫未被等待,当前方法在呼叫完成之前继续运行 "在visual studio中发出警告.在该警告的页面上,它指出:

只有当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止警告.

我确定我不想等待电话完成; 我不需要或没有时间.但这一呼吁可能引发例外.

我偶然发现了这个问题几次,我确信这是一个必须有共同解决方案的常见问题.

如何在不等待结果的情况下安全地调用异步方法?

更新:

对于那些建议我等待结果的人来说,这是响应我们的Web服务(ASP.NET Web API)上的Web请求的代码.在UI上下文中等待保持UI线程空闲,但是在Web请求调用中等待将在响应请求之前等待任务完成,从而无缘无故地增加响应时间.

c# exception task task-parallel-library async-await

283
推荐指数
7
解决办法
16万
查看次数

在C#中使用"params"关键字表示通用参数

Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>今天在C#.NET 4.5中遇到了这位美丽的代表.我假设16是一个任意停止的地方(哪些方法有超过16个参数?)但它让我思考:在C#中是否可以指定泛型类型可以有任意数量的类型参数?类似于方法的params关键字允许方法的任意数量的参数.像这样的东西:

public class MyInfiniteGenericType<params T[]> { ... }
Run Code Online (Sandbox Code Playgroud)

然后,在类中,您可以通过枚举它们或使用允许在方法中使用T[index]的相同方式来访问类型参数params.

我个人从来没有使用它,但Func代表将是一个使用它的完美场所.不需要16种不同类型的Func!

所以我的问题是,这可以在C#中以任何方式完成,如果不是,这是一个愚蠢的想法吗?

c# generics

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

Guid.NewGuid()VS来自Random.Next()的随机字符串生成器

我的同事和我正在讨论使用哪些方法来自动生成用户ID和发布ID以便在数据库中进行识别:

一个选项使用Random的单个实例,并采用一些有用的参数,因此它可以重用于各种string-gen案例(即从4位数字引脚到20位字母数字id).这是代码:

// This is created once for the lifetime of the server instance
class RandomStringGenerator
{
    public const string ALPHANUMERIC_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    public const string ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public const string NUMERIC = "1234567890";

    Random rand = new Random();
    public string GetRandomString(int length, params char[] chars)
    {
        string s = "";
        for (int i = 0; i < length; i++)
            s += chars[rand.Next() % chars.Length];

        return s;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择就是使用:

Guid.NewGuid();
Run Code Online (Sandbox Code Playgroud)

在MSDN上看到Guid.NewGuid

我们都知道这Guid.NewGuid()可以满足我们的需求,但我宁愿使用自定义方法.它做同样的事情,但有更多的控制.

我的同事认为,由于自定义方法已经自己制作,因此更容易产生碰撞.我承认我并不完全了解Random的实现,但我认为它与Guid.NewGuid()一样随机.自定义方法的典型用法可能是:

RandomStringGenerator …
Run Code Online (Sandbox Code Playgroud)

c# random guid

25
推荐指数
2
解决办法
3万
查看次数

如何在C#中读取和编辑.txt文件?

例如,我有一个txt文件,内容如下:

12 345 45
2342 234 45 2 2 45345
234 546 34 3 45 65 765
12 23 434 34 56 76 5
Run Code Online (Sandbox Code Playgroud)

我想在所有数字之间插入一个逗号,在每行的开头添加左括号,在每行的末尾添加右括号.所以在编辑之后它应该是:

{12, 345, 45}
{2342, 234, 45, 2, 2, 45345}
{234, 546, 34, 3, 45, 65, 765}
{12, 23, 434, 34, 56, 76, 5}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

c# file text-files

9
推荐指数
3
解决办法
5万
查看次数

rxjs中Observable.lift和Observable.pipe有什么区别?

文档定义Observable.lift(operator: Operator)为:

创建一个新的Observable,将此Observable作为源,并将传递的运算符定义为新的observable的运算符.

Observable.pipe(operations: ...*)作为:

用于将功能操作符拼接成链.返回按传递顺序调用的所有运算符的Observable结果.

所以显然.pipe可以接受多个运营商,而.lift不是.但pipe也可以接受单个运营商,因此这不可能是唯一的区别.仅从文档来看,我不清楚它们是什么以及它们存在的原因.有人可以解释一下这些功能的用途,以及何时应该使用它们?


到目前为止的观察

以下代码(typescript):

let myObservable = Observable.of(1, 2, 3);
let timesByTwoPiped = myObservable.pipe(map(n => n * 2));
let timesByTwoLift = myObservable.lift(new TimesByTwoOperator());

timesByTwoPiped.subscribe(a => console.log('pipe:' + a));
timesByTwoLift.subscribe(a => console.log('lift:' + a));
Run Code Online (Sandbox Code Playgroud)

并且TimesByTwoOperator:

class TimesByTwoOperator implements Operator<number, number> {
  call(subscriber: Subscriber<number>, source: Observable<number>): void | Function | AnonymousSubscription {
    source.subscribe(n => {
      subscriber.next(n * 2);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

似乎使用.lift …

javascript rxjs angular

9
推荐指数
2
解决办法
4050
查看次数

如何为一对多关系配置Solr

我正在开发使用Solr的搜索应用程序,该应用程序需要搜索分成几章的“书”。一本书可能看起来像这样:

title: "book title"
author: "mr whoever"
chapters: [
    {
        title: "some chapter title"
        text: "blah blah blah"
    },
    {
        title: "some other title"
        text: "blah blah blah"
    },
    ... etc.
]
Run Code Online (Sandbox Code Playgroud)

搜索要求:

  • 用户搜索的是书籍,而不是章节,因此,给定所有章节文本,顶部的结果必须是总体上最相关的书籍。

  • 用户需要查看一本书中哪些章节已匹配,有关这些章节的信息以及每个章节进行了多少匹配。

结果样机


进展:

多值字段

Solr支持多值字段(即每本书多个章节),但是在书本文档上每个字段不可能有两个字段(标题和文本)。

Solr“加入”

我不知道这是否有必要。每章仅归一本书所有,因此似乎我们可以将它们全部放入一个文档中,而无需过多重复。

动态场

例如,具有诸如“ chapter1text_txt”,“ chapter1title_txt”和“ chapter2text_txt”的字段,并且仅结合每章的信息独立于solr,因此solr不知道“ chapter1text_txt”,“ chapter1title_txt”是同一事物的一部分。

配置schema.xml以支持和搜索此类文档的正确方法是什么?

search solr flatten

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

给定PartitionKey,RowKey,属性名称和值,如何更新该实体的属性值?

使用azure表,如果我知道实体的RowKey和PartitionKey(因此我可以检索该实体),如何编辑该实体上的特定属性值?

这听起来像一个非常标准的操作,但正常的做法是这样的:

public void UpdateEntity(ITableEntity entity)
{
    TableOperation replaceOperation = TableOperation.Replace(entity);
    table.Execute(replaceOperation);
}
Run Code Online (Sandbox Code Playgroud)

即整个C#TableEntity对象作为替换对象而不是单独的属性名称/值对给出.

我想要更像的东西:

public void UpdateEntityProperty<T>(string partitionKey, string rowKey,
                                string propertyName, T newPropertyValue)
{
    TableOperation retrieveOperation = TableOperation.Retrieve(partitionKey, rowKey);
    TableResult retrievedResult = table.Execute(retrieveOperation);
    TableEntity entity = (TableEntity)retrievedResult.Result;

    // This  line, of course, doesn't compile. But you get the idea.
    entity.SetPropertyValue(propertyName, newPropertyValue);

    TableOperation replaceOperation = TableOperation.Replace(entity);
    table.Execute(replaceOperation);
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,在幕后,行被存储为一组与该行上的属性相对应的键值对,因此更新属性的值应该很容易,而不必定义从TableEntity派生的整个C#类来执行此操作.

我该怎么做?

c# azure azure-table-storage

4
推荐指数
2
解决办法
7038
查看次数

如何以十六进制颜色在图形对象上绘制实心圆?

我需要在Hex中给出的特定颜色的位图上绘制一个圆圈."画笔"类仅为特定颜色指定名称.

Bitmap bitmap = new Bitmap(20, 20);
Graphics g = Graphics.FromImage(bitmap);
g.FillEllipse(Brushes.AliceBlue, 0, 0, 19, 19); //The input parameter is not a Hex
//g.FillEllipse(new Brush("#ff00ffff"), 0, 0, 19, 19); <<This is the kind of think I need.
Run Code Online (Sandbox Code Playgroud)

有办法做到这一点吗?

确切的问题:我正在生成KML(对于谷歌地球),我正在生成许多具有不同十六进制颜色的行.颜色是以数学方式生成的,我需要保持这种颜色,这样我就能制作出我想要的颜色.我需要为每条完全相同颜色的线生成一个PNG图标.

c# rgb colors bitmap

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

强制C#方法只传递正参数?

我想强制我的方法只接受一个整数参数,如果它是积极的.如果该方法传递一个整数,它应该抛出编译时错误.实现这一目标的最佳方法是什么?

目前我在方法Math.Abs(Int)内部使用,但我希望错误在编译时.

.net c# oop

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

如何使用LINQ使用大小以外的条件订购浮点数数组?

例如,我有一个浮点数数组:

float[] numbers = new float[] { 1, 34, 65, 23, 56, 8, 5, 3, 234 };
Run Code Online (Sandbox Code Playgroud)

如果我使用:

Array.Sort(numbers);
Run Code Online (Sandbox Code Playgroud)

然后按数字的大小对数组进行排序.

我想用另一个标准对数字进行排序,因此如果f(A)<f(B),元素A应该在元素B之前,而不是通常的A <B.

因此,例如,如果我想根据值模5对它们进行排序.数组将变为:

5, 65, 1, 56, 3, 8, 23, 34, 234
Run Code Online (Sandbox Code Playgroud)

我认为它可以通过LINQ完成,但我不确定如何.

c# linq arrays

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