小编JSt*_*ard的帖子

带异步和不带异步的任务返回类型

我对async关键字的行为有点困惑。

可以说我有两种方法,

public async Task DoSomething1()
{
    await Task.Run(() =>
    {
        for(int i = 0; i<3; i++)
        {
            Console.WriteLine("I m doing something:" + i);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

public Task DoSomething2()
{
    return Task.Run(() =>
    {
        for(int i = 0; i<3; i++)
        {
            Console.WriteLine("I m doing something:" + i);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这两种方法都值得期待。但是当我编写一个Task没有async关键字的返回类型的方法时,我需要返回 aTask否则编译器会产生错误。方法应该返回其类型是很常见的事情。但是当我将它与async关键字一起使用时,编译器会生成另一个错误,您无法返回Task. 那么它是什么意思呢?我完全糊涂了。请帮我。

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

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

TPL 完成与完成

我需要从旧数据库导入客户相关数据,并在此过程中执行多次转换。这意味着单个条目需要执行额外的“事件”(同步产品、创建发票等)。

我最初的解决方案是一种简单的并行方法。它工作正常,但有时会出现问题。如果当前处理的客户需要等待相同类型的事件,他们的处理队列可能会被卡住并最终超时,导致每个底层事件也失败(它们依赖于失败的事件)。这种情况并不总是发生,但还是很烦人。

于是我有了另一个想法,分批工作。我的意思是不仅限制同时处理的客户数量,还限制广播到队列的事件数量。在四处寻找想法时,我找到了这个答案,它指向TPL DataFlow

我做了一个骨架来熟悉它。Complete()我设置了一个简单的管道,但我对和 waiting的用法有点困惑Completion()

步骤如下

  1. 制作一个数字列表(要导入的客户的 ID) - 这是导入逻辑之外的,它只是为了能够触发其余的逻辑
  2. 创建一个BatchBlock(能够限制同时处理的客户数量)
  3. MyClass1根据 id ( TransformBlock<int, MyClass1>)创建单个项目
  4. MyClass2执行一些逻辑并生成( )的集合TransformManyBlock<MyClass1, MyClass2>- 例如,睡眠 1 秒
  5. 对集合中的每个项目执行一些逻辑 ( ActionBlock<MyClass2>) - 例如,休眠 1 秒

这是完整的代码:

public static class Program
{
    private static void Main(string[] args)
    {
        var batchBlock = new BatchBlock<int>(2);
        for (var i = 1; i < 10; i++)
        {
            batchBlock.Post(i);
        }


        batchBlock.Complete();
        while (batchBlock.TryReceive(null, …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing multithreading task-parallel-library tpl-dataflow

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

两个键,功能相同

我刚刚开始编码,但是,我遇到了这个问题,但是谷歌我似乎无法找到正确的答案.

if(Input.GetKey(KeyCode.D)) || if(Input.GetKey(KeyCode.RightArrow))
{
    target_right = new Vector2(transform.position.x + right_increment, transform.position.y);
    transform.position = target_right;

}
Run Code Online (Sandbox Code Playgroud)

我在网上看过|| 用简单的英语表示或.我想要按钮D和右箭头按钮来执行代码.我该怎么做呢?

c#

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

以适当的方式在异步方法中连续三个任务的结果

我是异步编程的新手.我很想知道这些任务是否可以同时运行.考虑我有这个代码:

public async Task<IList<WebData>> GetAllAsync()
{
    var twitterData = await ProvidetwitterDataAsync();
    var facebookData = await ProvidefacebookDataAsync();
    var linkedinData = await ProvidelinkedinDataAsync();
    return twitterData .Concat(facebookData ).Concat(linkedinData ).ToList();
}
Run Code Online (Sandbox Code Playgroud)

我想因为我用过await twitterData那个Task应该完成,然后下一个Task将开始,因为我想连续这三个列表的结果我用这种方式编写它,我想知道有没有办法可以同时完成这三个任务?这种实施方式是正确的还是有更好的方法?

c# task async-await

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

收集结果的 C# ActionBlock 等效项

我目前正在使用 ActionBlock 来处理连续启动的异步作业。它非常适合处理发布到它的每个项目,但无法收集每个作业的结果列表。

我可以使用什么来以线程安全的方式收集工作结果?

我的代码目前是这样的:

var actionBlock = new ActionBlock<int> (async i => await Process(i));
for(int i = 0; i < 100; i++)
{
    actionBlock.Post(i);
}
actionBlock.Complete();
await actionBlock.Completion;
Run Code Online (Sandbox Code Playgroud)

我尝试使用 TransformBlock 代替,但在等待完成时它会无限期地挂起。完成状态为“WaitingForActivation”。

我的 TransformBlock 代码是这样的:

var transformBlock = new TransformBlock<int, string> (async i => await Process(i));
for(int i = 0; i < 100; i++)
{
    actionBlock.Post(i);
}
actionBlock.Complete();
await actionBlock.Completion;
transformBlock.TryReceiveAll(out IList<string> strings);
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task-parallel-library tpl-dataflow

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

这两个异步函数之间的区别

您好我没有得到以下两个asnyc函数之间的区别,有人可以解释一下吗?它们都没有返回IRestResponse,所以我无法访问StatusCode字段.我必须在这里投吗?

public async Task<IRestResponse> Post<T>(string Ressource, T ObjTOPost) where T : new()
{
    return await Task.Factory.StartNew(() =>
    {
        var client = new RestClient("test.com");
        var request = new RestRequest(Ressource, Method.POST);

        var response = client.Execute(request);

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

还有这个:

public async Task<IRestResponse> Post<T>(string Ressource, T ObjTOPost) where T : new()
{
    var client = new RestClient("test.com");

    var request = new RestRequest(Ressource, Method.POST);

    var response = await client.ExecuteTaskAsync<T>(request);

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

c# asynchronous async-await

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

System.TypeLoadException 在我尝试编译时发生

System.TypeLoadException'无法使用来自 typeref 的标记 01000016 解析类型(程序集“Xamarin.Forms.Core,Version=2.0.0.0,Culture=neutral,PublicKeyToken=null”中的预期类“Xamarin.Forms.Xaml.Diagnostics.VisualDiagnostics” )'

这是出现此错误的 App.cs 文件:

namespace NewApp

{

    public partial class App : Application

    {

        public App()

        {

            InitializeComponent(); // GETTING THE ERROR
            Material.Init(this);
            MainPage = new MaterialNavigationPage(new MainPage());

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# visual-studio xamarin.forms

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

无法将systems.collections.generic.list <systems.collections.generic.list <string >>转换为字符串

不知道为什么这不起作用,但我有:

public static string SetRows(DataTable table, int maximumCount)
{
    var finalFile = new List<List<string>>();
    foreach (DataRow row in table.Rows)
    {
        int i = 0;
        List<string> excelTotal = new List<string>();
        for (i = 0; i < maximumCount; i++)
        {
            excelTotal.Add(row[i].ToString());                   
        }
        finalFile.Add(excelTotal);
    }

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

我正在另一个列表中创建一个列表.

c#

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