Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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# 方法的接口包含ValueTuple_C#_Interface_Async Await_Tuples_Task - Fatal编程技术网

C# 方法的接口包含ValueTuple

C# 方法的接口包含ValueTuple,c#,interface,async-await,tuples,task,C#,Interface,Async Await,Tuples,Task,我有接口: public Interface Inter1 { .... Task<(ITestBulk testBulk, bool resultBulk)> GetBulk(int par1, int par2, string par3); } 但是找不到m_resultBulk。我做错了什么?在队列中 (ITestBulk, m_resultBulk) = await service.GetBulk(1, 2, "ggg"); 左侧的元组缺少第一个元组元素的变量名。

我有接口:

public Interface Inter1
{
 ....
 Task<(ITestBulk testBulk, bool resultBulk)> GetBulk(int par1, int par2, string par3);
}
但是找不到
m_resultBulk
。我做错了什么?

在队列中

 (ITestBulk, m_resultBulk) = await service.GetBulk(1, 2, "ggg");
左侧的元组缺少第一个元组元素的变量名。 如果不需要
ITestBulk
值,可以使用如下丢弃:

(_, m_resultBulk) = await service.GetBulk(1, 2, "ggg");
如果需要,则需要声明一个变量(因为不能在元组中混合声明和解构):

(作为旁注,您的
NewBulk
方法应该返回
Task
,否则其调用者不能等待其完成-重要的是要避免启动“触发并忘记”异步逻辑的代码,因为在异步继续完成(或正确捕获错误)后无法安全地清理-唯一的例外是WinForms和WPF中的事件处理程序-这是因为它们的同步上下文将正确处理任何失败的继续。 -此外,异步方法的名称通常应该以
…async
后缀结尾

无论如何,您的主要问题是
GetBulk
(应命名为
GetBulkAsync
)的调用站点没有正确声明
ValueTuple
返回本地

您希望这样做:

class MyClass
{
    private bool lastNewBulkResult;

    internal async Task NewBulkAsync()
    {
        (ITestBulk testBulk, bool resultBulk) = await this.service.GetBulkAsync( 1, 2, "ggg" ); // Specify `ConfigureAwait` as appropriate too.

        this.lastNewBulkResult = resultBulk;
    }
}
但是,此代码存在问题:
GetBulkAsync
之后的延续可能在任何线程上运行-这意味着您的
MyClass
的实例状态(即其字段)正在以线程不安全的方式进行变异。解决方案是重新设计类,使其依赖于不可变状态,并通过方法参数和返回值(或异步结果)表示状态的更改,从而完全避免了线程安全问题

关于混合
ValueTuple
wait
: 本声明:

(ITestBulk testBulk, bool resultBulk) = await this.service.GetBulkAsync( 1, 2, "ggg" );
相当于:

Task<(ITestBulk testBulk, bool resultBulk)> task = this.service.GetBulkAsync( 1, 2, "ggg" );
(ITestBulk testBulk, bool resultBulk) = await task;
Task<(ITestBulk testBulk, bool resultBulk)> task = this.service.GetBulkAsync( 1, 2, "ggg" );
(ITestBulk testBulk, bool resultBulk) tupleValue = await task;
ITestBulk testBulk = tupleValue.testBulk;
bool resultBulk = tupleValue.resultBulk;
或者这个:

var tupleValue = await this.service.GetBulkAsync( 1, 2, "ggg" );
ITestBulk testBulk = tupleValue.testBulk;
bool resultBulk = tupleValue.resultBulk;

我编辑您的问题标题是因为
(TX,x,TY y)
值元组
,而不是
元组
(即
元组(x,y),
)(ITestBulk,似乎缺少元组第一项的变量
Task<(ITestBulk testBulk, bool resultBulk)> task = this.service.GetBulkAsync( 1, 2, "ggg" );
(ITestBulk testBulk, bool resultBulk) tupleValue = await task;
ITestBulk testBulk = tupleValue.testBulk;
bool resultBulk = tupleValue.resultBulk;
var task = this.service.GetBulkAsync( 1, 2, "ggg" );
var tupleValue = await task;
ITestBulk testBulk = tupleValue.testBulk;
bool resultBulk = tupleValue.resultBulk;
var tupleValue = await this.service.GetBulkAsync( 1, 2, "ggg" );
ITestBulk testBulk = tupleValue.testBulk;
bool resultBulk = tupleValue.resultBulk;