小编i3a*_*non的帖子

在C#中重复一个字符的最佳方法

什么\t是在C#中生成字符串的最佳方法

我正在学习C#并尝试不同的方式来说同样的事情.

Tabs(uint t)是返回的功能stringt的量\t

例如Tabs(3)返回"\t\t\t"

这三种实施方式中哪Tabs(uint numTabs)一种最好?

当然,这取决于"最佳"的含义.

  1. LINQ版本只有两行,很不错.但重复和聚合的调用是否会不必要地耗费时间/资源?

  2. StringBuilder版本是很清楚的,但是是StringBuilder类莫名其妙慢?

  3. string版本是基本的,这意味着它很容易理解.

  4. 这根本不重要吗?它们都是平等的吗?

这些都是帮助我更好地了解C#的问题.

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
    return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; 
}  

private string Tabs(uint numTabs)
{
    StringBuilder sb = new StringBuilder();
    for (uint i = 0; i < numTabs; i++)
        sb.Append("\t");

    return sb.ToString(); …
Run Code Online (Sandbox Code Playgroud)

.net c# string

751
推荐指数
12
解决办法
35万
查看次数

如果我的接口必须返回Task,那么实现无操作的最佳方法是什么?

在下面的代码中,由于接口,类LazyBar必须从它的方法返回一个任务(并且为了参数而不能更改).如果LazyBars的实现是不寻常的,那么它恰好快速且同步地运行 - 从方法返回No-Operation任务的最佳方法是什么?

我已经在Task.Delay(0)下面了,但是我想知道如果这个函数被调用了很多(如果参数起见,比如说每秒数百次),这是否有任何性能副作用:

  • 这种语法糖会不会变成大事?
  • 它是否开始堵塞应用程序的线程池?
  • 编译器切割器是否足以以Delay(0)不同方式处理?
  • 请问return Task.Run(() => { });有什么不同?

有没有更好的办法?

using System.Threading.Tasks;

namespace MyAsyncTest
{
    internal interface IFooFace
    {
        Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
    }

    /// <summary>
    /// An implementation, that unlike most cases, will not have a long-running
    /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
    /// </summary>
    internal class LazyBar : IFooFace
    {
        #region IFooFace Members

        public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
        {
            // First, do something really quick
            var x = 1; …
Run Code Online (Sandbox Code Playgroud)

.net c# threadpool task-parallel-library async-await

390
推荐指数
6
解决办法
14万
查看次数

任务构造函数中的取消令牌:为什么?

某些System.Threading.Tasks.Task构造函数将a CancellationToken作为参数:

CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,从方法体内部无法实际获取传入的令牌(例如,没有什么比这样Task.CurrentTask.CancellationToken).必须通过某种其他机制提供令牌,例如状态对象或在lambda中捕获.

那么在构造函数中提供取消令牌的目的是什么呢?

c# .net-4.0 task-parallel-library cancellation-token

214
推荐指数
4
解决办法
5万
查看次数

为什么我不能在lambda表达式中使用null传播运算符?

我经常在我的代码中使用null传播运算符,因为它给了我更多可读代码,特别是在长查询中我不必对每个使用的类进行空值检查.

以下代码抛出一个编译错误,我们不能在lambda中使用null传播运算符.

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Run Code Online (Sandbox Code Playgroud)

错误 :

错误CS8072表达式树lambda可能不包含空传播运算符.

C#如果真的不能做任何其他事情,可以轻松地将上面的代码转换为代码到下面的代码!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么C#什么也不做,只是抛出一个编译器错误?

.net c# compiler-errors c#-6.0 null-propagation-operator

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

使用C#的MongoDB GridFs,如何存储图像等文件?

我正在开发一个以mongodb作为我的后端的网络应用程序.我想让用户将图片上传到他们的个人资料,如链接个人资料照片.我正在使用带有MVC2的aspx页面,我读到GridFs库用于存储大型文件类型作为二进制文件.我到处寻找线索是如何完成的,但是mongodb没有任何关于C#api或GridFs C#的文档.我感到困惑和困惑,真的可以使用另一组大脑.

任何人都知道如何实际实现一个文件上传控制器,用于存储用户上传到mongodb集合中的图像?太感谢了!

我尝试过这种变化无济于事.

Database db = mongo.getDB("Blog");
GridFile file = new GridFile(db);
file.Create("image.jpg");

var images = db.GetCollection("images");
images.Insert(file.ToDocument());
Run Code Online (Sandbox Code Playgroud)

.net c# mongodb gridfs mongodb-.net-driver

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

AsyncLocal的语义与逻辑调用上下文有何不同?

.NET 4.6引入了AsyncLocal<T>用于沿异步控制流流动环境数据的类.我以前用过CallContext.LogicalGet/SetData这个目的,我想知道两者在语义上是否以及以何种方式不同(除了明显的API差异,如强类型和缺乏对字符串键的依赖).

.net c# async-await .net-4.6

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

DateTime可以在64位环境中撕裂吗?

在C#设置中,只要变量的大小最大native int(即32位运行时环境中的4个字节和64位上的8个字节),变量的值就是原子级.在一个64位的环境,它包括所有的引用类型和最内置值类型(byte,short,int,long,等等).

设置更大的值不是原子的,并且可能导致仅更新部分内存的撕裂.

DateTime是一个结构,它只包含一个ulong包含其所有数据(TicksDateTimeKind)的字段,并且ulong在64位环境中本身是原子的.

这是否意味着它DateTime也是原子的?或者以下代码是否会在某些时候导致撕裂?

static DateTime _value;
static void Main()
{
    for (int i = 0; i < 10; i++)
    {
        new Thread(_ =>
        {
            var random = new Random();
            while (true)
            {
                _value = new DateTime((long)random.Next() << 30 | (long)random.Next());
            }
        }).Start();
    }

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

.net c# concurrency datetime tearing

51
推荐指数
2
解决办法
2856
查看次数

多个等待与Task.WaitAll - 等效?

在性能方面,会这2种方法运行GetAllWidgets()GetAllFoos()并行?

有没有理由使用一个而不是另一个?在编译器的幕后似乎发生了很多事情,所以我觉得不清楚.

=============方法A:使用多个等待======================

public async Task<IHttpActionResult> MethodA()
{
    var customer = new Customer();

    customer.Widgets = await _widgetService.GetAllWidgets();
    customer.Foos = await _fooService.GetAllFoos();

    return Ok(customer);
}
Run Code Online (Sandbox Code Playgroud)

===============方法B:使用Task.WaitAll =====================

public async Task<IHttpActionResult> MethodB()
{
    var customer = new Customer();

    var getAllWidgetsTask = _widgetService.GetAllWidgets();
    var getAllFoosTask = _fooService.GetAllFos();

    Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});

    customer.Widgets = getAllWidgetsTask.Result;
    customer.Foos = getAllFoosTask.Result;

    return Ok(customer);
}
Run Code Online (Sandbox Code Playgroud)

=====================================

.net c# task-parallel-library async-await

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

在新的C#6字符串语法中转义引号

我对C#6中的新功能感到非常兴奋,包括新的字符串语法:

var fullName = $"My Name is {FirstName} {LastName}";
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何在括号内转义引号来执行以下操作:

bool includePrefix = true;

var fullName = $"My name is {includePrefix ? "Mr. " : ""}{FirstName} {LastName}";
Run Code Online (Sandbox Code Playgroud)

C#6不喜欢这样.String.Format在第二种情况下,我不得不恢复使用.是否可以使用新语法来转义引号?

更新:是的,我已尝试使用\转义,但它无法识别.

c# c#-6.0

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

Task.Run是否被认为是ASP .NET MVC Web应用程序中的不良做法?

背景

我们目前正在开发一个Web应用程序,它依赖于ASP .NET MVC 5,Angular.JS 1.4,Web API 2和Entity Framework 6.出于可伸缩性的原因,Web应用程序的重量依赖于async/await模式.我们的域需要一些cpu密集型计算,这可能需要几秒钟(<10s).在过去,一些团队成员使用Task.Run,​​以加快计算速度.因为在ASP .NET MVC或Web API控制器中启动一个额外的线程被认为是一种不好的做法(该线程不为IIS所知,所以不是在AppDomain Recycle上考虑=>参见Stephen Cleary的博客文章),他们使用了ConfigureAwait(false).

public async Task CalculateAsync(double param1, double param2)
{
    // CalculateSync is synchronous and cpu-intensive (<10s)
    await Task.Run(() => this.CalculateSync(param1, param2))).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

问题

  • 在异步Web API控制器中使用Task.Run进行cpu绑定操作是否有任何性能优势?
  • ConfigureAwait(false)是否真的避免创建额外的线程?

c# asp.net asp.net-mvc task-parallel-library async-await

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