Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将函数包装为异步任务_C#_.net_Async Await_Task Parallel Library - Fatal编程技术网

C# 将函数包装为异步任务

C# 将函数包装为异步任务,c#,.net,async-await,task-parallel-library,C#,.net,Async Await,Task Parallel Library,我想包装一个函数,以便使用异步/等待模式: wcfClientService.GetSomeString(parameter); 这是一个来自WCF客户端的调用,我正在尝试使其异步,但这并不重要(我知道WCF支持异步,但假设我们没有访问WCF代码的权限) 我试图用Task.Factory.fromsync方法包装该方法,但似乎无法正确完成: private Task<string> WrapWcfServiceAsyncTask(uint parameter) { Func

我想包装一个函数,以便使用异步/等待模式:

wcfClientService.GetSomeString(parameter);
这是一个来自WCF客户端的调用,我正在尝试使其异步,但这并不重要(我知道WCF支持异步,但假设我们没有访问WCF代码的权限)

我试图用
Task.Factory.fromsync
方法包装该方法,但似乎无法正确完成:

private Task<string> WrapWcfServiceAsyncTask(uint parameter)
{
    Func<uint, string> func = i => { return wcfClientService.GetSomeString(parameter); };

    var t = Task<string>.Factory.FromAsync(
                                           // What goes here?
                                          );
    return t;
}
private Task WrapWcfServiceAsyncTask(uint参数)
{
Func Func=i=>{return wcfClientService.GetSomeString(参数);};
var t=Task.Factory.fromsync(
//这里有什么?
);
返回t;
}

或者更好的是,有人可以编写一个方法,将一个方法作为参数,并为它包装并返回一个
任务

您要做的是。你有一个同步操作,你想假装它是异步的

您可以使用
任务执行此操作。运行

var result = await Task.Run(() => wcfClientService.GetSomeString(parameter));
private async Task<string> WrapWcfServiceAsyncTask(uint parameter)
{
  return await wcfClientService.GetSomeStringAsync(parameter);
}
但这是毫无意义的,因为您只是将工作从一个
ThreadPool
线程转移到另一个线程

如果您想要一个异步操作,它需要以某种方式异步开始,可以是异步等待,也可以是开始/结束,等等


如果您的
BeginGetSomeString
/
EndSomeString
已经是异步的,那么您可以使用
FromAsync
将其转换为async Wait。

如果您使用现代版本的Visual Studio重新生成WCF代理,默认情况下应该生成它。请注意,WCF服务根本不需要更改;只有客户端代理需要更新

然后您可以使用普通的
wait
调用它的方法;无需执行
任务。运行

var result = await Task.Run(() => wcfClientService.GetSomeString(parameter));
private async Task<string> WrapWcfServiceAsyncTask(uint parameter)
{
  return await wcfClientService.GetSomeStringAsync(parameter);
}
专用异步任务WrapWcfServiceAsyncTask(uint参数)
{
返回wait wait wcfClientService.GetSomeStringAsync(参数);
}

您是否尝试过将阻止当前线程的
Task.Factory.StartNew
,因此,我宁愿使用
fromsync
,当您等待它时,它不会阻止任何线程。
Task.Factory.StartNew
只创建一个新的
Task
实例-它不会阻止当前线程它实际上会将工作从一个线程转移到另一个线程吗?我想当你等待一个任务时,它是异步运行的,但是在同一个线程上并行运行?(我需要使其异步,因为这是直接在UI线程上的,顺便说一句)这就是Task.Run所做的,当您从UI线程卸载时,它是合适的。当您使用async Wait和真正的异步操作时,您不需要线程,但是像
GetSomeString
这样的同步操作无法做到这一点。我使用的是VS2015,我在WCF服务中添加了一个服务引用,它没有生成返回任务的异步方法。。。我需要使用
slsvcuti.EXE
吗?我刚刚意识到我必须对其进行配置:右键单击服务引用,然后单击
configure service reference…
,然后在出现的窗口中选择
Generate asynchronous methods
。如果无法使用slsvcuti生成代码,会发生什么?如何使调用异步?@GabrielEspinoza:您应该能够使用Visual Studio生成异步方法。是的,我可以,但由于企业限制,我们使用自己的手动生成通道