我有一堆需要异步调用的web api调用.我从未使用过aysnc.
我创建了一个简单的测试控制台程序,类似于:
class Program
{
static void Main(string[] args)
{
ClassOne xx = new ClassOne();
var v1 = xx.DummyTask();
}
}
Run Code Online (Sandbox Code Playgroud)
将类定义为:
namespace GHTest.classes
{
public class ClassOne
{
GitHubClient client;
public ClassOne()
{
client = new GitHubClient(new ProductHeaderValue("OMHSite"));
}
public async Task<string> DummyTask()
{
Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
task.Wait();
var myResult = task.Result;
return myResult.FullName;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio声明我应该使用"await"运算符,因为此代码将同步运行.等待运营商在哪里?
此外,如果以下语句抛出异常,我如何在任务中捕获它
client.Repository.Get("openEHR", "CKM-mirror");
Run Code Online (Sandbox Code Playgroud) 有没有办法增加任务内部的int值?或者这是在任务中递增int的正确语法?示例代码:
public int erCount = 9;
static void Main(string[] args){
Task.Factory.StartNew(() => {
...do some task
if(errorfound)
erCount++;
});
Task.Wait();
Console.Writeline(erCount.toString());
}
Run Code Online (Sandbox Code Playgroud)
我似乎没有在线程内增加值.任何帮助都会很棒!
using System;
using System.Threading.Tasks;
namespace _1._8_Starting_A_New_Task
{
public static class Program
{
public static void Main()
{
Task t = new Task(() =>
{
for (int x = 0; x < 100; x++)
{
Console.Write('*');
}
});
t.Wait();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试并行化依赖外部资源的工作,并将其组合成一个结果字典.
为了说明我的需要,想象一下我想下载一组文件,并将每个结果放在一个字典中,其中键是url:
string[] urls = { "http://msdn.microsoft.com", "http://www.stackoverflow.com", "http://www.google.com" };
var fileContentTask = GetUrls(urls);
fileContentTask.Wait();
Dictionary<string, string> result = fileContentTask.Result;
// Do something
Run Code Online (Sandbox Code Playgroud)
但是,我能够编码GetUrls方法.我可以生成所有任务,但我没有找到如何在字典中合并结果:
static Task<Dictionary<string,string>> GetUrls(string[] urls)
{
var subTasks = from url in urls
let wc = new WebClient()
select wc.DownloadStringTaskAsync(url);
return Task.WhenAll(subTasks); // Does not compile
}
Run Code Online (Sandbox Code Playgroud)
如何将生成的任务合并到字典中?
为什么返回a的方法Task在返回它的实例时不会被执行.我认为这必须发生,因为await方法/委托会将它放入某个队列,然后执行生成的任务.
那么为什么这Task在调用时永远不会被执行Do()?
public void Do()
{
SomeTask().Wait()
}
public async Task SomeTask()
{
return new Task(() => { Console.WriteLine("Hello World!") });
}
Run Code Online (Sandbox Code Playgroud)
编辑
或者我需要await Task.Run(...)吗?
非常感谢你!
我试图从异步方法执行两个不同的任务,但我的第二个任务应该从第一个任务开始.我试过使用ContinueWith但没有成功.这是我的示例代码:
class Program
{
static List<string> GlobalList1 = null;
static List<string> GlobalList2 = null;
static void Main(string[] args)
{
Task firstTask = new Task(DoFirstThing);
firstTask.Start();
firstTask.Wait();
Task secondTask = firstTask.ContinueWith(o => DoSecondThing(), TaskContinuationOptions.ExecuteSynchronously);
secondTask.Wait();
Console.ReadKey();
}
public async static void DoFirstThing()
{
Console.WriteLine("Doing first...");
Task t = new Task(FirstThing);
t.Start();
await t;
}
public async static void DoSecondThing()
{
Console.WriteLine("Doing second...");
Task t = new Task(SecondThing);
t.Start();
await t;
}
private async static void FirstThing()
{
Console.WriteLine("In First..");
Task t …Run Code Online (Sandbox Code Playgroud) 我正在学习Ada,我在理解并发模型方面遇到了一些问题.以下测试应用程序应创建3个并行运行的任务,并简单地打印一系列数字.如果我没有使用任务,entry那么一切都很好,但如果我使用条目,则程序调用块并且根本不会发生并发.
我知道有可能实现互斥和同步执行,但我无法理解如何分离任务,甚至可能创建其中的几个.
q_multithreading.ads:
package Q_MULTITHREADING is
task type TASK_LOOP is
end TASK_LOOP;
type TASK_LOOP_ACCESS is access TASK_LOOP;
--===========================================================================
task type TASK_ENTRY_LOOP is
entry P_ITERATE(to : in Integer);
end TASK_ENTRY_LOOP;
type TASK_ENTRY_LOOP_ACCESS is access TASK_ENTRY_LOOP;
--===========================================================================
procedure P_EXECUTE_NO_ENTRY;
procedure P_EXECUTE_ENTRY(to : in Integer);
end Q_MULTITHREADING;
Run Code Online (Sandbox Code Playgroud)
q_multithreading.adb:
with Ada.Text_IO;
package body Q_MULTITHREADING is
V_ID_COUNTER : Integer := 1;
--===========================================================================
task body TASK_LOOP is
V_ID : Integer := -1;
begin
V_ID := V_ID_COUNTER;
V_ID_COUNTER := V_ID_COUNTER + 1;
for i in …Run Code Online (Sandbox Code Playgroud) 我想使用异步任务同时执行多个循环(我不想使用Parallel.ForEach)
我做 :
static async void Run()
{
await MultiTasks();
}
static async Task MultiTasks()
{
var Loop1 = Loop1Async();
var Loop2 = Loop2Async();
await Loop1;
await Loop2;
}
static async Task Loop1Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 1 : " + i);
}
}
static async Task Loop2Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 2 : " + i);
}
}
Run Code Online (Sandbox Code Playgroud)
Run() 在我的Main方法中调用.
但是这两个循环不会在同一时间执行.第一圈完成后,第二圈开始 …
我有方法列表,需要并行化它们.如何在C#中做到这一点?我看到有一个Parallel命名空间?如何使用它?
method1()
method2()
method3()
method4()
Run Code Online (Sandbox Code Playgroud) 想知道,使用扩展方法是否会有任何问题Task<T>:
public static T Await<T>(this Task<T> task)
{
var result = default(T);
Task.Run(async () => result = await task).Wait();
return result;
}
Run Code Online (Sandbox Code Playgroud)
对于那些你希望从a获得结果的实例来说,这似乎是一个不错的节省时间,Task但是你的方法没有标记async.
task ×10
c# ×9
async-await ×3
asynchronous ×3
ada ×1
console ×1
continuewith ×1
multitasking ×1
openehr ×1
wait ×1