Skip to content

Commit 1b4ea5a

Browse files
committed
fix: tasker errors in stateless mode
1 parent 79cb6ac commit 1b4ea5a

5 files changed

Lines changed: 74 additions & 43 deletions

File tree

src/MaaFramework.Binding.Native/MaaContext.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public MaaContext(MaaContextHandle contextHandle)
2222
if (contextHandle == MaaContextHandle.Zero)
2323
throw new ArgumentException($"Value cannot be {MaaContextHandle.Zero}.", nameof(contextHandle));
2424
Handle = contextHandle;
25+
26+
var taskerHandle = MaaContextGetTasker(Handle);
27+
Tasker = NativeBindingContext.IsStatelessMode ? new MaaTasker(taskerHandle) : MaaTasker.Instances[taskerHandle];
2528
}
2629

2730
/// <inheritdoc/>
@@ -97,17 +100,7 @@ public bool OverrideNext(string nodeName, IEnumerable<string> nextList)
97100
/// <remarks>
98101
/// Wrapper of <see cref="MaaContextGetTasker"/>.
99102
/// </remarks>
100-
public MaaTasker Tasker
101-
{
102-
get
103-
{
104-
var taskerHandle = MaaContextGetTasker(Handle);
105-
if (NativeBindingContext.IsStatelessMode)
106-
return new MaaTasker(taskerHandle);
107-
else
108-
return MaaTasker.Instances[taskerHandle];
109-
}
110-
}
103+
public MaaTasker Tasker { get; }
111104

112105
object ICloneable.Clone()
113106
=> Clone();

src/MaaFramework.Binding.Native/MaaTasker.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,18 @@ public class MaaTasker : MaaCommon, IMaaTasker<MaaTaskerHandle>
2828
/// </remarks>
2929
protected internal static ConcurrentDictionary<MaaTaskerHandle, MaaTasker> Instances { get; } = [];
3030

31+
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。
3132
[SetsRequiredMembers]
3233
internal MaaTasker(MaaTaskerHandle handle)
3334
{
3435
SetHandle(handle, needReleased: false);
35-
Resource = new MaaResource(MaaTaskerGetResource(handle));
36-
Controller = new MaaController(MaaTaskerGetController(handle));
36+
_resource = new MaaResource(MaaTaskerGetResource(handle));
37+
_controller = new MaaController(MaaTaskerGetController(handle));
3738
DisposeOptions = DisposeOptions.None;
3839
Toolkit = MaaToolkit.Shared;
3940
Utility = MaaUtility.Shared;
4041
}
42+
#pragma warning restore CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。
4143

4244
/// <summary>
4345
/// Creates a <see cref="MaaTasker"/> instance.
@@ -80,18 +82,13 @@ public MaaTasker(MaaController controller, MaaResource resource, DisposeOptions
8082
/// <inheritdoc/>
8183
protected override void Dispose(bool disposing)
8284
{
83-
// Cannot destroy Instance before disposing Controller and Resource.
84-
8585
if (DisposeOptions.HasFlag(DisposeOptions.Controller))
86-
{
8786
Controller.Dispose();
88-
}
8987

9088
if (DisposeOptions.HasFlag(DisposeOptions.Resource))
91-
{
9289
Resource.Dispose();
93-
}
9490

91+
_ = Instances.TryRemove(new KeyValuePair<MaaTaskerHandle, MaaTasker>(Handle, this));
9592
base.Dispose(disposing);
9693
}
9794

@@ -122,6 +119,9 @@ public bool SetOption<T>(TaskerOption opt, T value)
122119
#pragma warning restore
123120
}
124121

122+
private MaaResource _resource = null!;
123+
private MaaController _controller = null!;
124+
125125
IMaaResource IMaaTasker.Resource
126126
{
127127
get => Resource;
@@ -143,14 +143,14 @@ public required MaaResource Resource
143143
get
144144
{
145145
if (!IsInvalid)
146-
_ = MaaTaskerGetResource(Handle).ThrowIfNotEquals(field.Handle, MaaInteroperationException.ResourceModifiedMessage);
147-
return field;
146+
_ = MaaTaskerGetResource(Handle).ThrowIfNotEquals(_resource.Handle, MaaInteroperationException.ResourceModifiedMessage);
147+
return _resource;
148148
}
149149
set
150150
{
151151
ArgumentNullException.ThrowIfNull(value);
152152
_ = MaaTaskerBindResource(Handle, value.Handle).ThrowIfFalse(MaaInteroperationException.ResourceBindingFailedMessage);
153-
field = value;
153+
_resource = value;
154154
}
155155
}
156156

@@ -163,14 +163,14 @@ public required MaaController Controller
163163
get
164164
{
165165
if (!IsInvalid)
166-
_ = MaaTaskerGetController(Handle).ThrowIfNotEquals(field.Handle, MaaInteroperationException.ControllerModifiedMessage);
167-
return field;
166+
_ = MaaTaskerGetController(Handle).ThrowIfNotEquals(_controller.Handle, MaaInteroperationException.ControllerModifiedMessage);
167+
return _controller;
168168
}
169169
set
170170
{
171171
ArgumentNullException.ThrowIfNull(value);
172172
_ = MaaTaskerBindController(Handle, value.Handle).ThrowIfFalse(MaaInteroperationException.ControllerBindingFailedMessage);
173-
field = value;
173+
_controller = value;
174174
}
175175
}
176176

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"profiles": {
3+
"MaaFramework.Binding.UnitTests": {
4+
"commandName": "Project",
5+
"commandLineArgs": "CurrentDirectory CurrentDirectory 6CDC213A-085C-40C8-8665-635820D10425"
6+
}
7+
}
8+
}

src/MaaFramework.Binding.UnitTests/Test_Custom.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@ public bool Analyze(in IMaaContext context, in AnalyzeArgs args, in AnalyzeResul
4747
Assert.IsNotNull(cloneContext);
4848
Assert.IsNull(
4949
cloneContext.RunRecognition(DiffEntry, "{}", (IMaaImageBuffer<nint>)args.Image));
50-
Assert.AreSame(
51-
context.Tasker, cloneContext.Tasker);
50+
if (!context.Tasker.IsStateless)
51+
{
52+
Assert.AreSame(
53+
context.Tasker, cloneContext.Tasker);
54+
}
55+
5256
Assert.AreEqual(
5357
context.TaskJob.Id, cloneContext.TaskJob.Id);
5458

@@ -142,7 +146,7 @@ public bool PressKey(int keycode)
142146

143147
public bool RequestResolution(out int width, out int height)
144148
{
145-
#if MAA_NATIVE
149+
#if MAA_NATIVE
146150
using var image = new MaaImageBuffer();
147151
#endif
148152
if (Screencap(image))

src/MaaFramework.Binding.UnitTests/Test_IMaaAgentClient.cs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,7 @@ public void Interface_LinkStart_LinkStop_AgentServerProcess(MaaTypes type, IMaaA
6262
{
6363
_ = Assert.ThrowsException<InvalidOperationException>(() =>
6464
maaAgentClient.AgentServerProcess);
65-
var ret = maaAgentClient.LinkStart((socketId, nativeAssemblyDirectory) =>
66-
{
67-
string[] arguments =
68-
[
69-
typeof(Test_IMaaAgentServer).Assembly.Location,
70-
nativeAssemblyDirectory,
71-
Environment.CurrentDirectory,
72-
socketId
73-
];
74-
75-
return Process.Start(new ProcessStartInfo("dotnet", string.Join(' ', arguments))
76-
{
77-
UseShellExecute = false,
78-
});
79-
});
65+
var ret = maaAgentClient.LinkStart(StartupAgentServer);
8066
Assert.IsTrue(
8167
ret);
8268
Assert.IsTrue( // double start
@@ -92,4 +78,44 @@ public void Interface_LinkStart_LinkStop_AgentServerProcess(MaaTypes type, IMaaA
9278
Assert.IsTrue(
9379
maaAgentClient.AgentServerProcess.HasExited);
9480
}
81+
82+
[TestMethod]
83+
[MaaData(MaaTypes.All, nameof(Data))]
84+
public void RunTask(MaaTypes type, IMaaAgentClient maaAgentClient)
85+
{
86+
using var maa = new MaaTasker
87+
{
88+
Controller = new MaaAdbController(Common.AdbPath, Common.Address, AdbScreencapMethods.Encode, AdbInputMethods.AdbShell, Common.AdbConfig, Common.AgentPath),
89+
Resource = new MaaResource(),
90+
DisposeOptions = DisposeOptions.All,
91+
};
92+
Assert.IsTrue(
93+
maa.IsInitialized);
94+
95+
using var agent = MaaAgentClient.Create("6CDC213A-085C-40C8-8665-635820D10425", maa.Resource);
96+
using (var cts = new CancellationTokenSource(10000))
97+
{
98+
Assert.IsTrue(
99+
// agent.LinkStart());
100+
agent.LinkStart(StartupAgentServer, cts.Token));
101+
}
102+
var status = maa
103+
.AppendTask(Custom.NodeName, Custom.Param)
104+
.Wait();
105+
106+
Assert.AreEqual(MaaJobStatus.Succeeded,
107+
status);
108+
Assert.IsTrue(
109+
agent.LinkStop());
110+
111+
}
112+
113+
private static Process? StartupAgentServer(string identifier, string nativeAssemblyDirectory)
114+
{
115+
return Process.Start(new ProcessStartInfo(
116+
"dotnet", $"{typeof(Test_IMaaAgentServer).Assembly.Location} {nativeAssemblyDirectory} {Environment.CurrentDirectory} {identifier}")
117+
{
118+
UseShellExecute = false,
119+
});
120+
}
95121
}

0 commit comments

Comments
 (0)