我正在开展一个多任务网络项目,我是新手Threading.Tasks.我实现了一个简单的Task.Factory.StartNew(),我想知道我该怎么做Task.Run()?
这是基本代码:
Task.Factory.StartNew(new Action<object>(
(x) =>
{
// Do something with 'x'
}), rawData);
Run Code Online (Sandbox Code Playgroud)
我System.Threading.Tasks.Task在对象浏览器中查看,我找不到Action<T>类似的参数.只有Action这需要void参数,没有类型.
只有两件事情similiar:static Task Run(Action action)和static Task Run(Func<Task> function),但不能发布与两个参数(一个或多个).
是的,我知道我可以,但创建一个简单的扩展方法,我的主要问题是,我们可以把它写在一行用Task.Run()?
我已经编写了一些我通过Windows任务调度程序运行的C#应用程序.它们正在成功运行(我可以从他们正在编写的日志文件中看到)但是Windows任务调度程序显示它们返回的最后一次运行结果0xE0434352.我在C#应用程序中需要做些什么才能将成功代码返回给Windows任务调度程序?
根据我过去的内容,我们鼓励您不要以编程方式更改Windows应用程序的优先级,如果这样做,则不应将其更改为"实时".
与"高"和"高于正常"相比,"实时"流程优先级设置有何作用?
我正在尝试Task使用Python 3的相对较新的asyncio模块正确理解和实现两个并发运行的对象.
简而言之,asyncio似乎旨在Task通过事件循环处理异步进程和并发执行.它促进了await(在异步函数中应用)作为无回调方式的使用,等待和使用结果,而不会阻塞事件循环.(期货和回调仍然是一个可行的选择.)
它还提供了asyncio.Task()类,一个专门Future 用于包装协同程序的子类.优选地通过使用该asyncio.ensure_future()方法来调用.asyncio任务的预期用途是允许独立运行的任务与同一事件循环中的其他任务"同时"运行.我的理解是Tasks连接到事件循环,然后自动保持在await语句之间驱动协程.
我喜欢能够使用并发任务而不需要使用其中一个Executor类的想法,但我没有找到很多关于实现的详细说明.
这就是我目前正在做的事情:
import asyncio
print('running async test')
async def say_boo():
i = 0
while True:
await asyncio.sleep(0)
print('...boo {0}'.format(i))
i += 1
async def say_baa():
i = 0
while True:
await asyncio.sleep(0)
print('...baa {0}'.format(i))
i += 1
# wrap in Task object
# -> automatically attaches to event loop and executes
boo = asyncio.ensure_future(say_boo())
baa = …Run Code Online (Sandbox Code Playgroud) 我有一个接口,它暴露了一些异步方法.更具体地说,它定义了返回Task或Task <T>的方法.我正在使用async/await关键字.
我正在实现这个接口.但是,在其中一些方法中,此实现没有任何东西需要等待.出于这个原因,我得到编译器警告"这个异步方法缺少'等待'运算符,并将同步运行......"
我理解为什么我会收到错误,但我想知道在这种情况下我是否应该对它们采取任何措施.忽略编译器警告感觉不对.
我知道我可以通过等待Task.Run来修复它,但对于只做一些廉价操作的方法来说感觉不对.它听起来也会为执行添加不必要的开销,但后来我也不确定是否已经存在,因为async关键字存在.
我应该忽略这些警告还是有办法解决这个问题,我没有看到?
添加如下评论:
// TODO: Refactor this code
Run Code Online (Sandbox Code Playgroud)
...在任务列表中创建一个我可以查看的任务等.标记的列!允许您按优先级对这些任务进行排序.
如何设置特定任务的优先级?
正如一些人在.NET 4.0中看到的那样,他们已经添加了一个新的命名空间System.Threading.Tasks,它基本上就是手段,一个任务.使用ThreadPool我只使用了几天.
哪一个更有效,资源消耗更少?(或者总体上更好?)
public class test
{
public async Task Go()
{
await PrintAnswerToLife();
Console.WriteLine("done");
}
public async Task PrintAnswerToLife()
{
int answer = await GetAnswerToLife();
Console.WriteLine(answer);
}
public async Task<int> GetAnswerToLife()
{
await Task.Delay(5000);
int answer = 21 * 2;
return answer;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想在main()方法中调用Go,我该怎么做?我正在尝试c#新功能,我知道我可以将异步方法挂钩到事件并通过触发该事件,可以调用异步方法.
但是如果我想直接在main方法中调用它呢?我怎样才能做到这一点?
我做了类似的事情
class Program
{
static void Main(string[] args)
{
test t = new test();
t.Go().GetAwaiter().OnCompleted(() =>
{
Console.WriteLine("finished");
});
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎这是一个死锁,屏幕上没有任何内容.
我使用异步任务上传图像并获得一些结果.
在上传图像时,我看到一个进度对话框,用onPreExecute()方法编写,如下所示:
protected void onPreExecute() {
uploadingDialog = new ProgressDialog(MyActivity.this);
uploadingDialog.setMessage("uploading");
uploadingDialog.setCancelable(true);
uploadingDialog.show();
}
Run Code Online (Sandbox Code Playgroud)
好的,当我按下后退按钮时,显然对话框因setCancelable(true)而消失.
但(显然)异步任务不会停止.
那么我该如何解决这个问题呢?当我按下后退按钮时,我想取消对话和异步任务.有任何想法吗?
编辑:找到解决方案.请看下面我的答案.
在Scala中有一个Promise类,可用于手动完成Future.我正在寻找C#的替代品.
我正在编写测试,我希望它看起来与此类似:
// var MyResult has a field `Header`
var promise = new Promise<MyResult>;
handlerMyEventsWithHandler( msg =>
promise.Complete(msg);
);
// Wait for 2 seconds
var myResult = promise.Future.Await(2000);
Assert.Equals("my header", myResult.Header);
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是C#的正确模式,但我无法找到一种合理的方法来实现同样的东西,即使是有些不同的模式.
编辑:请注意,这async//await没有帮助,因为我没有任务等待!我只能访问将在另一个线程上运行的处理程序.
task ×10
c# ×6
async-await ×3
asynchronous ×3
.net ×2
android ×1
back ×1
comments ×1
concurrency ×1
future ×1
lambda ×1
promise ×1
python ×1
python-3.4 ×1
taskmanager ×1
threadpool ×1
todo ×1
windows ×1