我对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. 那么它是什么意思呢?我完全糊涂了。请帮我。
我需要从旧数据库导入客户相关数据,并在此过程中执行多次转换。这意味着单个条目需要执行额外的“事件”(同步产品、创建发票等)。
我最初的解决方案是一种简单的并行方法。它工作正常,但有时会出现问题。如果当前处理的客户需要等待相同类型的事件,他们的处理队列可能会被卡住并最终超时,导致每个底层事件也失败(它们依赖于失败的事件)。这种情况并不总是发生,但还是很烦人。
于是我有了另一个想法,分批工作。我的意思是不仅限制同时处理的客户数量,还限制广播到队列的事件数量。在四处寻找想法时,我找到了这个答案,它指向TPL DataFlow。
我做了一个骨架来熟悉它。Complete()我设置了一个简单的管道,但我对和 waiting的用法有点困惑Completion()。
步骤如下
BatchBlock(能够限制同时处理的客户数量)MyClass1根据 id ( TransformBlock<int, MyClass1>)创建单个项目MyClass2执行一些逻辑并生成( )的集合TransformManyBlock<MyClass1, MyClass2>- 例如,睡眠 1 秒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
我刚刚开始编码,但是,我遇到了这个问题,但是谷歌我似乎无法找到正确的答案.
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和右箭头按钮来执行代码.我该怎么做呢?
我是异步编程的新手.我很想知道这些任务是否可以同时运行.考虑我有这个代码:
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将开始,因为我想连续这三个列表的结果我用这种方式编写它,我想知道有没有办法可以同时完成这三个任务?这种实施方式是正确的还是有更好的方法?
我目前正在使用 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) 您好我没有得到以下两个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) 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) 不知道为什么这不起作用,但我有:
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)
我正在另一个列表中创建一个列表.