Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4104964e38 | ||
|
|
3bbd1edf06 | ||
|
|
41cc260b5c | ||
|
|
6cd5063c9b | ||
|
|
e544df6d01 | ||
|
|
f952d2383c | ||
|
|
8a29e147d3 | ||
|
|
8a19128e7f | ||
|
|
7dc9fbd8ff | ||
|
|
31a179e647 |
@@ -17,9 +17,11 @@ echo "When this file exists, app will not store configs under this folder" >"${P
|
||||
if [ $Arch = "linux-64" ]; then
|
||||
Arch2="x86_64"
|
||||
Arch3="amd64"
|
||||
Interpreter="ld-linux-x86-64.so.2"
|
||||
else
|
||||
Arch2="aarch64"
|
||||
Arch3="arm64"
|
||||
Interpreter="ld-linux-aarch64.so.1"
|
||||
fi
|
||||
echo $Arch2
|
||||
|
||||
@@ -29,6 +31,7 @@ cat >"${PackagePath}/AppDir/AppRun" <<-EOF
|
||||
HERE="\$(dirname "\$(readlink -f "\${0}")")"
|
||||
export PATH="\${HERE}"/opt/v2rayN/:"\${PATH}"
|
||||
export LD_LIBRARY_PATH="\${HERE}"/opt/v2rayN/:"\${LD_LIBRARY_PATH}"
|
||||
cd "\${HERE}/opt/v2rayN"
|
||||
exec "\${HERE}/opt/v2rayN/v2rayN" \$@
|
||||
EOF
|
||||
|
||||
@@ -45,9 +48,41 @@ EOF
|
||||
|
||||
sudo cp "${PackagePath}/AppDir/opt/v2rayN/v2rayN.png" "${PackagePath}/AppDir/v2rayN.png"
|
||||
sudo dpkg --add-architecture ${Arch3}
|
||||
sudo apt update
|
||||
mkdir deb_folder
|
||||
cd deb_folder
|
||||
apt download libicu74:${Arch3}
|
||||
apt download libstdc++6:${Arch3}
|
||||
apt download libc6:${Arch3}
|
||||
apt download libcrypt1:${Arch3}
|
||||
apt download libgcc-s1:${Arch3}
|
||||
apt download libidn2-0:${Arch3}
|
||||
apt download gcc-12-base:${Arch3}
|
||||
apt download zlib1g:${Arch3}
|
||||
apt download libfreetype6:${Arch3}
|
||||
apt download libexpat1:${Arch3}
|
||||
apt download libbrotli1:${Arch3}
|
||||
apt download libx11-6:${Arch3}
|
||||
apt download libx11-xcb1:${Arch3}
|
||||
apt download libxcb1:${Arch3}
|
||||
apt download libxau6:${Arch3}
|
||||
apt download libxdmcp6:${Arch3}
|
||||
apt download libbsd0:${Arch3}
|
||||
apt download libmd0:${Arch3}
|
||||
apt download libice6:${Arch3}
|
||||
apt download libsm6:${Arch3}
|
||||
apt download libuuid1:${Arch3}
|
||||
apt download libxrandr2:${Arch3}
|
||||
apt download libxext6:${Arch3}
|
||||
apt download libxrender1:${Arch3}
|
||||
apt download libxi6:${Arch3}
|
||||
apt download libsm6:${Arch3}
|
||||
apt download libxcursor1:${Arch3}
|
||||
apt download libxfixes3:${Arch3}
|
||||
apt download libpng16-16:${Arch3} || true
|
||||
apt download libpng16-16t64:${Arch3} || true
|
||||
apt download libicu66:${Arch3} || true
|
||||
apt download libicu70:${Arch3} || true
|
||||
apt download libicu74:${Arch3} || true
|
||||
apt download libfontconfig1:${Arch3} || true
|
||||
apt download libfontconfig:${Arch3} || true
|
||||
mkdir ../output_folder
|
||||
@@ -62,6 +97,12 @@ rm -rf deb_folder output_folder
|
||||
sudo chmod 0755 "${PackagePath}/AppDir/opt/v2rayN/v2rayN"
|
||||
sudo chmod 0755 "${PackagePath}/AppDir/AppRun"
|
||||
|
||||
sudo apt install -y patchelf
|
||||
|
||||
pushd "${PackagePath}/AppDir/opt/v2rayN"
|
||||
patchelf --set-interpreter ${Interpreter} v2rayN
|
||||
popd
|
||||
|
||||
# desktop && PATH
|
||||
|
||||
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
|
||||
<PropertyGroup>
|
||||
<Version>7.8.1</Version>
|
||||
<Version>7.8.3</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
@@ -28,6 +28,5 @@
|
||||
|
||||
<UseSystemResourceKeys>true</UseSystemResourceKeys>
|
||||
<PublishSingleFile>true</PublishSingleFile>
|
||||
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace ServiceLib.Enums
|
||||
namespace ServiceLib.Enums
|
||||
{
|
||||
public enum EMsgCommand
|
||||
{
|
||||
@@ -6,7 +6,6 @@
|
||||
SendMsgView,
|
||||
SendSnackMsg,
|
||||
RefreshProfiles,
|
||||
StopSpeedtest,
|
||||
AppExit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using static ServiceLib.Models.ClashProxies;
|
||||
using static ServiceLib.Models.ClashProxies;
|
||||
|
||||
namespace ServiceLib.Handler
|
||||
{
|
||||
@@ -38,63 +38,63 @@ namespace ServiceLib.Handler
|
||||
public void ClashProxiesDelayTest(bool blAll, List<ClashProxyModel> lstProxy, Action<ClashProxyModel?, string> updateFunc)
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
if (blAll)
|
||||
{
|
||||
for (int i = 0; i < 5; i++)
|
||||
if (blAll)
|
||||
{
|
||||
if (_proxies != null)
|
||||
for (var i = 0; i < 5; i++)
|
||||
{
|
||||
break;
|
||||
if (_proxies != null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
Task.Delay(5000).Wait();
|
||||
}
|
||||
if (_proxies == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lstProxy = new List<ClashProxyModel>();
|
||||
foreach (KeyValuePair<string, ProxiesItem> kv in _proxies)
|
||||
{
|
||||
if (Global.notAllowTestType.Contains(kv.Value.type.ToLower()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
lstProxy.Add(new ClashProxyModel()
|
||||
{
|
||||
Name = kv.Value.name,
|
||||
Type = kv.Value.type.ToLower(),
|
||||
});
|
||||
}
|
||||
Task.Delay(5000).Wait();
|
||||
}
|
||||
if (_proxies == null)
|
||||
|
||||
if (lstProxy == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lstProxy = new List<ClashProxyModel>();
|
||||
foreach (KeyValuePair<string, ProxiesItem> kv in _proxies)
|
||||
var urlBase = $"{GetApiUrl()}/proxies";
|
||||
urlBase += @"/{0}/delay?timeout=10000&url=" + AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl;
|
||||
|
||||
var tasks = new List<Task>();
|
||||
foreach (var it in lstProxy)
|
||||
{
|
||||
if (Global.notAllowTestType.Contains(kv.Value.type.ToLower()))
|
||||
if (Global.notAllowTestType.Contains(it.Type.ToLower()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
lstProxy.Add(new ClashProxyModel()
|
||||
var name = it.Name;
|
||||
var url = string.Format(urlBase, name);
|
||||
tasks.Add(Task.Run(async () =>
|
||||
{
|
||||
Name = kv.Value.name,
|
||||
Type = kv.Value.type.ToLower(),
|
||||
});
|
||||
var result = await HttpClientHelper.Instance.TryGetAsync(url);
|
||||
updateFunc?.Invoke(it, result);
|
||||
}));
|
||||
}
|
||||
}
|
||||
Task.WaitAll(tasks.ToArray());
|
||||
|
||||
if (lstProxy == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var urlBase = $"{GetApiUrl()}/proxies";
|
||||
urlBase += @"/{0}/delay?timeout=10000&url=" + AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl;
|
||||
|
||||
List<Task> tasks = new List<Task>();
|
||||
foreach (var it in lstProxy)
|
||||
{
|
||||
if (Global.notAllowTestType.Contains(it.Type.ToLower()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var name = it.Name;
|
||||
var url = string.Format(urlBase, name);
|
||||
tasks.Add(Task.Run(async () =>
|
||||
{
|
||||
var result = await HttpClientHelper.Instance.TryGetAsync(url);
|
||||
updateFunc?.Invoke(it, result);
|
||||
}));
|
||||
}
|
||||
Task.WaitAll(tasks.ToArray());
|
||||
|
||||
Task.Delay(1000).Wait();
|
||||
updateFunc?.Invoke(null, "");
|
||||
});
|
||||
Task.Delay(1000).Wait();
|
||||
updateFunc?.Invoke(null, "");
|
||||
});
|
||||
}
|
||||
|
||||
public List<ProxiesItem>? GetClashProxyGroups()
|
||||
@@ -120,7 +120,7 @@ namespace ServiceLib.Handler
|
||||
try
|
||||
{
|
||||
var url = $"{GetApiUrl()}/proxies/{name}";
|
||||
Dictionary<string, string> headers = new Dictionary<string, string>();
|
||||
var headers = new Dictionary<string, string>();
|
||||
headers.Add("name", nameNode);
|
||||
await HttpClientHelper.Instance.PutAsync(url, headers);
|
||||
}
|
||||
@@ -148,7 +148,7 @@ namespace ServiceLib.Handler
|
||||
try
|
||||
{
|
||||
var url = $"{GetApiUrl()}/configs?force=true";
|
||||
Dictionary<string, string> headers = new Dictionary<string, string>();
|
||||
var headers = new Dictionary<string, string>();
|
||||
headers.Add("path", filePath);
|
||||
await HttpClientHelper.Instance.PutAsync(url, headers);
|
||||
}
|
||||
@@ -194,4 +194,4 @@ namespace ServiceLib.Handler
|
||||
return $"{Global.HttpProtocol}{Global.Loopback}:{AppHandler.Instance.StatePort2}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace ServiceLib.Handler
|
||||
new CoreInfo
|
||||
{
|
||||
CoreType = ECoreType.v2fly,
|
||||
CoreExes = ["wv2ray", "v2ray"],
|
||||
CoreExes = ["v2ray"],
|
||||
Arguments = "{0}",
|
||||
Url = GetCoreUrl(ECoreType.v2fly),
|
||||
Match = "V2Ray",
|
||||
@@ -95,7 +95,7 @@ namespace ServiceLib.Handler
|
||||
new CoreInfo
|
||||
{
|
||||
CoreType = ECoreType.Xray,
|
||||
CoreExes = ["wxray","xray"],
|
||||
CoreExes = ["xray"],
|
||||
Arguments = "run -c {0}",
|
||||
Url = GetCoreUrl(ECoreType.Xray),
|
||||
ReleaseApiUrl = urlXray.Replace(Global.GithubUrl, Global.GithubApiUrl),
|
||||
|
||||
@@ -4,23 +4,15 @@ namespace ServiceLib.Models
|
||||
{
|
||||
public class V2rayConfig
|
||||
{
|
||||
public string? remarks { get; set; }
|
||||
|
||||
public Log4Ray log { get; set; }
|
||||
|
||||
public List<Inbounds4Ray> inbounds { get; set; }
|
||||
|
||||
public List<Outbounds4Ray> outbounds { get; set; }
|
||||
|
||||
public Stats4Ray? stats { get; set; }
|
||||
|
||||
public Metrics4Ray? metrics { get; set; }
|
||||
|
||||
public Policy4Ray? policy { get; set; }
|
||||
|
||||
public object dns { get; set; }
|
||||
|
||||
public List<Inbounds4Ray> inbounds { get; set; }
|
||||
public List<Outbounds4Ray> outbounds { get; set; }
|
||||
public Routing4Ray routing { get; set; }
|
||||
public Metrics4Ray? metrics { get; set; }
|
||||
public Policy4Ray? policy { get; set; }
|
||||
public Stats4Ray? stats { get; set; }
|
||||
public string? remarks { get; set; }
|
||||
}
|
||||
|
||||
public class Stats4Ray
|
||||
@@ -398,4 +390,4 @@ namespace ServiceLib.Models
|
||||
public string? length { get; set; }
|
||||
public string? interval { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,10 +344,10 @@
|
||||
<value>لطفاً DNS سفارشی صحیح را پر کنید</value>
|
||||
</data>
|
||||
<data name="TransportPathTip1" xml:space="preserve">
|
||||
<value>*ws path</value>
|
||||
<value>* مسیر ws</value>
|
||||
</data>
|
||||
<data name="TransportPathTip2" xml:space="preserve">
|
||||
<value>*h2 path</value>
|
||||
<value>* مسیر h2</value>
|
||||
</data>
|
||||
<data name="TransportPathTip3" xml:space="preserve">
|
||||
<value>*QUIC key/Kcp seed</value>
|
||||
@@ -356,13 +356,13 @@
|
||||
<value>*grpc serviceName</value>
|
||||
</data>
|
||||
<data name="TransportRequestHostTip1" xml:space="preserve">
|
||||
<value>*http host Separated by commas (,)</value>
|
||||
<value>*هاست http جدا شده با کاما (،)</value>
|
||||
</data>
|
||||
<data name="TransportRequestHostTip2" xml:space="preserve">
|
||||
<value>*ws host</value>
|
||||
<value>*هاست ws</value>
|
||||
</data>
|
||||
<data name="TransportRequestHostTip3" xml:space="preserve">
|
||||
<value>*h2 host Separated by commas (,)</value>
|
||||
<value>*هاست h2 با کاما (،) جدا شده است</value>
|
||||
</data>
|
||||
<data name="TransportRequestHostTip4" xml:space="preserve">
|
||||
<value>*QUIC securty</value>
|
||||
@@ -377,7 +377,7 @@
|
||||
<value>*QUIC camouflage type</value>
|
||||
</data>
|
||||
<data name="TransportHeaderTypeTip4" xml:space="preserve">
|
||||
<value>*grpc mode</value>
|
||||
<value>*حالت grpc</value>
|
||||
</data>
|
||||
<data name="LvTLS" xml:space="preserve">
|
||||
<value>TLS</value>
|
||||
@@ -404,7 +404,7 @@
|
||||
<value>درحال تست کردن...</value>
|
||||
</data>
|
||||
<data name="LabLAN" xml:space="preserve">
|
||||
<value>LAN</value>
|
||||
<value>شبکه محلی</value>
|
||||
</data>
|
||||
<data name="LabLocal" xml:space="preserve">
|
||||
<value>محلی</value>
|
||||
@@ -1394,6 +1394,6 @@
|
||||
<value>کپی کردن دستور پروکسی در کلیپ بورد</value>
|
||||
</data>
|
||||
<data name="SpeedtestingTestFailedPart" xml:space="preserve">
|
||||
<value>Starting retesting failed parts, {0} remaining. Press ESC to terminate...</value>
|
||||
<value>شروع آزمایش مجدد قطعات ناموفق، {0} باقی مانده است. برای خاتمه ESC را فشار دهید...</value>
|
||||
</data>
|
||||
</root>
|
||||
</root>
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace ServiceLib.Services.CoreConfig
|
||||
//Mixin
|
||||
try
|
||||
{
|
||||
MixinContent(fileContent, node);
|
||||
await MixinContent(fileContent, node);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -158,20 +158,21 @@ namespace ServiceLib.Services.CoreConfig
|
||||
}
|
||||
}
|
||||
|
||||
private void MixinContent(Dictionary<string, object> fileContent, ProfileItem node)
|
||||
private async Task MixinContent(Dictionary<string, object> fileContent, ProfileItem node)
|
||||
{
|
||||
//if (!_config.clashUIItem.enableMixinContent)
|
||||
//{
|
||||
// return;
|
||||
//}
|
||||
|
||||
var path = Utils.GetConfigPath(Global.ClashMixinConfigFileName);
|
||||
if (!File.Exists(path))
|
||||
if (!_config.ClashUIItem.EnableMixinContent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var txtFile = File.ReadAllText(Utils.GetConfigPath(Global.ClashMixinConfigFileName));
|
||||
var path = Utils.GetConfigPath(Global.ClashMixinConfigFileName);
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
var mixin = EmbedUtils.GetEmbedText(Global.ClashMixinYaml);
|
||||
await File.AppendAllTextAsync(path, mixin);
|
||||
}
|
||||
|
||||
var txtFile = await File.ReadAllTextAsync(Utils.GetConfigPath(Global.ClashMixinConfigFileName));
|
||||
|
||||
var mixinContent = YamlUtils.FromYaml<Dictionary<string, object>>(txtFile);
|
||||
if (mixinContent == null)
|
||||
@@ -269,4 +270,4 @@ namespace ServiceLib.Services.CoreConfig
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +1,47 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ServiceLib.Services
|
||||
{
|
||||
public class SpeedtestService
|
||||
{
|
||||
private static readonly string _tag = "SpeedtestService";
|
||||
private Config? _config;
|
||||
private Action<SpeedTestResult>? _updateFunc;
|
||||
private static readonly ConcurrentBag<string> _lstExitLoop = new();
|
||||
|
||||
private bool _exitLoop = false;
|
||||
private static readonly string _tag = "SpeedtestService";
|
||||
|
||||
public SpeedtestService(Config config, ESpeedActionType actionType, List<ProfileItem> selecteds, Action<SpeedTestResult> updateFunc)
|
||||
public SpeedtestService(Config config, Action<SpeedTestResult> updateFunc)
|
||||
{
|
||||
_config = config;
|
||||
_updateFunc = updateFunc;
|
||||
}
|
||||
|
||||
MessageBus.Current.Listen<string>(EMsgCommand.StopSpeedtest.ToString()).Subscribe(ExitLoop);
|
||||
|
||||
public void RunLoop(ESpeedActionType actionType, List<ProfileItem> selecteds)
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var exitLoopKey = Utils.GetGuid(false);
|
||||
_lstExitLoop.Add(exitLoopKey);
|
||||
|
||||
var lstSelected = GetClearItem(actionType, selecteds);
|
||||
await RunAsync(actionType, lstSelected);
|
||||
await RunAsync(actionType, lstSelected, exitLoopKey);
|
||||
UpdateFunc("", ResUI.SpeedtestingCompleted);
|
||||
});
|
||||
}
|
||||
|
||||
private async Task RunAsync(ESpeedActionType actionType, List<ServerTestItem> lstSelected, int pageSize = 0)
|
||||
public void ExitLoop()
|
||||
{
|
||||
if (_lstExitLoop.Count > 0)
|
||||
{
|
||||
UpdateFunc("", ResUI.SpeedtestingStop);
|
||||
|
||||
_lstExitLoop.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RunAsync(ESpeedActionType actionType, List<ServerTestItem> lstSelected, string exitLoopKey, int pageSize = 0)
|
||||
{
|
||||
if (actionType == ESpeedActionType.Tcping)
|
||||
{
|
||||
@@ -47,9 +60,9 @@ namespace ServiceLib.Services
|
||||
{
|
||||
var ret = actionType switch
|
||||
{
|
||||
ESpeedActionType.Realping => await RunRealPingAsync(lst),
|
||||
ESpeedActionType.Speedtest => await RunSpeedTestAsync(lst),
|
||||
ESpeedActionType.Mixedtest => await RunMixedTestAsync(lst),
|
||||
ESpeedActionType.Realping => await RunRealPingAsync(lst, exitLoopKey),
|
||||
ESpeedActionType.Speedtest => await RunSpeedTestAsync(lst, exitLoopKey),
|
||||
ESpeedActionType.Mixedtest => await RunMixedTestAsync(lst, exitLoopKey),
|
||||
_ => true
|
||||
};
|
||||
if (ret == false)
|
||||
@@ -63,14 +76,14 @@ namespace ServiceLib.Services
|
||||
var pageSizeNext = pageSize / 2;
|
||||
if (lstFailed.Count > 0 && pageSizeNext > 0)
|
||||
{
|
||||
if (_exitLoop)
|
||||
if (_lstExitLoop.Any(p => p == exitLoopKey) == false)
|
||||
{
|
||||
UpdateFunc("", ResUI.SpeedtestingSkip);
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateFunc("", string.Format(ResUI.SpeedtestingTestFailedPart, lstFailed.Count));
|
||||
await RunAsync(actionType, lstFailed, pageSizeNext);
|
||||
await RunAsync(actionType, lstFailed, exitLoopKey, pageSizeNext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,14 +156,6 @@ namespace ServiceLib.Services
|
||||
return lstTest;
|
||||
}
|
||||
|
||||
private void ExitLoop(string x)
|
||||
{
|
||||
if (_exitLoop)
|
||||
return;
|
||||
_exitLoop = true;
|
||||
UpdateFunc("", ResUI.SpeedtestingStop);
|
||||
}
|
||||
|
||||
private async Task RunTcpingAsync(List<ServerTestItem> selecteds)
|
||||
{
|
||||
try
|
||||
@@ -190,7 +195,7 @@ namespace ServiceLib.Services
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<bool> RunRealPingAsync(List<ServerTestItem> selecteds)
|
||||
private async Task<bool> RunRealPingAsync(List<ServerTestItem> selecteds, string exitLoopKey)
|
||||
{
|
||||
var pid = -1;
|
||||
try
|
||||
@@ -249,7 +254,7 @@ namespace ServiceLib.Services
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<bool> RunSpeedTestAsync(List<ServerTestItem> selecteds)
|
||||
private async Task<bool> RunSpeedTestAsync(List<ServerTestItem> selecteds, string exitLoopKey)
|
||||
{
|
||||
var pid = -1;
|
||||
pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds);
|
||||
@@ -265,11 +270,12 @@ namespace ServiceLib.Services
|
||||
|
||||
foreach (var it in selecteds)
|
||||
{
|
||||
if (_exitLoop)
|
||||
if (_lstExitLoop.Any(p => p == exitLoopKey) == false)
|
||||
{
|
||||
UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!it.AllowTest)
|
||||
{
|
||||
continue;
|
||||
@@ -311,7 +317,7 @@ namespace ServiceLib.Services
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<bool> RunSpeedTestMulti(List<ServerTestItem> selecteds)
|
||||
private async Task<bool> RunSpeedTestMultiAsync(List<ServerTestItem> selecteds, string exitLoopKey)
|
||||
{
|
||||
var pid = -1;
|
||||
pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds);
|
||||
@@ -327,7 +333,7 @@ namespace ServiceLib.Services
|
||||
|
||||
foreach (var it in selecteds)
|
||||
{
|
||||
if (_exitLoop)
|
||||
if (_lstExitLoop.Any(p => p == exitLoopKey) == false)
|
||||
{
|
||||
UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip);
|
||||
continue;
|
||||
@@ -376,9 +382,9 @@ namespace ServiceLib.Services
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<bool> RunMixedTestAsync(List<ServerTestItem> selecteds)
|
||||
private async Task<bool> RunMixedTestAsync(List<ServerTestItem> selecteds, string exitLoopKey)
|
||||
{
|
||||
var ret = await RunRealPingAsync(selecteds);
|
||||
var ret = await RunRealPingAsync(selecteds, exitLoopKey);
|
||||
if (ret == false)
|
||||
{
|
||||
return false;
|
||||
@@ -386,7 +392,7 @@ namespace ServiceLib.Services
|
||||
|
||||
await Task.Delay(1000);
|
||||
|
||||
var ret2 = await RunSpeedTestMulti(selecteds);
|
||||
var ret2 = await RunSpeedTestMultiAsync(selecteds, exitLoopKey);
|
||||
if (ret2 == false)
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace ServiceLib.Services.Statistics
|
||||
Task.Run(Run);
|
||||
}
|
||||
|
||||
private async void Init()
|
||||
private async Task Init()
|
||||
{
|
||||
await Task.Delay(5000);
|
||||
|
||||
@@ -53,9 +53,9 @@ namespace ServiceLib.Services.Statistics
|
||||
}
|
||||
}
|
||||
|
||||
private async void Run()
|
||||
private async Task Run()
|
||||
{
|
||||
Init();
|
||||
await Init();
|
||||
|
||||
while (!_exitFlag)
|
||||
{
|
||||
@@ -73,7 +73,7 @@ namespace ServiceLib.Services.Statistics
|
||||
{
|
||||
webSocket.Abort();
|
||||
webSocket = null;
|
||||
Init();
|
||||
await Init();
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace ServiceLib.Services.Statistics
|
||||
_exitFlag = true;
|
||||
}
|
||||
|
||||
private async void Run()
|
||||
private async Task Run()
|
||||
{
|
||||
while (!_exitFlag)
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace ServiceLib.ViewModels
|
||||
private List<ProfileItem> _lstProfile;
|
||||
private string _serverFilter = string.Empty;
|
||||
private Dictionary<string, bool> _dicHeaderSort = new();
|
||||
private SpeedtestService? _speedtestService;
|
||||
|
||||
#endregion private prop
|
||||
|
||||
@@ -722,15 +723,13 @@ namespace ServiceLib.ViewModels
|
||||
return;
|
||||
}
|
||||
|
||||
_ = new SpeedtestService(_config, actionType, lstSelecteds, (SpeedTestResult result) =>
|
||||
{
|
||||
_updateView?.Invoke(EViewAction.DispatcherSpeedTest, result);
|
||||
});
|
||||
_speedtestService ??= new SpeedtestService(_config, (SpeedTestResult result) => _updateView?.Invoke(EViewAction.DispatcherSpeedTest, result));
|
||||
_speedtestService?.RunLoop(actionType, lstSelecteds);
|
||||
}
|
||||
|
||||
public void ServerSpeedtestStop()
|
||||
{
|
||||
MessageBus.Current.SendMessage("", EMsgCommand.StopSpeedtest.ToString());
|
||||
_speedtestService?.ExitLoop();
|
||||
}
|
||||
|
||||
private async Task Export2ClientConfigAsync(bool blClipboard)
|
||||
|
||||
Reference in New Issue
Block a user