【发布时间】:2021-12-25 23:53:17
【问题描述】:
在文章await anything; 中有一个我想使用的部分示例,但它没有显示实现。
具体来说:
例如,考虑想要启动另一个进程,然后 异步等待该过程完成,例如
await Process.Start(“Foo.exe”);
您可以使用如下所示的 GetAwaiter 方法来做到这一点:
public static TaskAwaiter<int> GetAwaiter(this Process process)
{
var tcs = new TaskCompletionSource<int>();
process.EnableRaisingEvents = true;
process.Exited += (s, e) => tcs.TrySetResult(process.ExitCode);
if (process.HasExited) tcs.TrySetResult(process.ExitCode);
return tcs.Task.GetAwaiter();
}
我目前使用的代码:
using System;
using System.Diagnostics;
namespace asynchawait
{
internal class Program
{
static Process opensslP1;
static Process opensslP2;
static Process opensslP3;
static void Main(string[] args)
{
Run();
Console.ReadKey();
}
static void Run()
{
/**
* OpenSSL - Show version info
*
* $ openssl version
*
* Output text: OpenSSL 3.1.0-dev (Library: OpenSSL 3.1.0-dev )
*
*/
opensslP1 = new Process();
opensslP1.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
opensslP1.StartInfo.FileName = @"openssl.exe";
opensslP1.StartInfo.Arguments = @"version";
opensslP1.StartInfo.RedirectStandardOutput = true;
opensslP1.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data);
opensslP1.StartInfo.UseShellExecute = false;
opensslP1.StartInfo.ErrorDialog = true;
//opensslP1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
opensslP1.EnableRaisingEvents = true;
opensslP1.Exited += new EventHandler(opensslP1_Exited);
opensslP1.Start();
opensslP1.BeginOutputReadLine();
/**
* OpenSSL - Generate PKCS#3 Diffie-Hellman parameters
*
* $ openssl dhparam -out pkcs3_www_example_com_2048bit.pem 2048
*
*
* Output file: pkcs3_www_example_com_1024bit.pem
*
* -----BEGIN DH PARAMETERS-----
* MIIBCAKCAQEAkfjs7ZsQdsa3Fa4BieuCOfQmG8l5u2COnzqW8JlDGp6wW2HEO/1h
* 4vqMDRmBlGVdRSIZNudD/AJiMfU8lplsBBt8Ijh0GNvTxYXRFCUFMz01CDI9IMBk
* 7uKTnoOgUJlL6V+b2PkfvFl0emRmzlioruo+jvtAuSnst9aUcTUvnAD+Oekw9Z3W
* p8NDZmwpGCPiNXFOmKOebJpfoi1d9tZka3jjEsJmWDhxvS0vSKd7O54wBo4qJMo2
* m1f7gkMwh5vWOc7X+yYe9q5R0UB+zaZi5YdtT9ajjvN+8ixaIv9rQHxSRRP/b6Y1
* VirBv4PJM3NVK3O3gS8aEJLIDxqyJus+twIBAg==
* -----END DH PARAMETERS-----
*
*/
opensslP2 = new Process();
opensslP2.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
opensslP2.StartInfo.FileName = @"openssl.exe";
opensslP2.StartInfo.Arguments = @"dhparam -out pkcs3_www_example_com_2048bit.pem 2048";
opensslP2.StartInfo.RedirectStandardOutput = false;
//opensslP2.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data);
opensslP2.StartInfo.UseShellExecute = true;
opensslP2.StartInfo.ErrorDialog = true;
opensslP2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
opensslP2.EnableRaisingEvents = true;
opensslP2.Exited += new EventHandler(opensslP2_Exited);
opensslP2.Start();
/**
* OpenSSL - Generate PKCS#8 RSA Private Key & PKCS#10 Certificate Signing Request
*
* $ openssl req -new -newkey rsa:2048 -nodes -keyout pkcs8_www_example_com_2048bit.key -out pkcs10_www_example_com_2048bit.csr -config openssl.cnf -subj "/C=US/ST=CA/L=Silicon Valley/O=XYZ Inc./OU=IT Division/CN=www.example.com/emailAddress=admin@example.com"
*
*
* Output file: pkcs8_www_example_com_2048bit.key
*
* -----BEGIN PRIVATE KEY-----
* MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC1tpg03hh/+AEz
* cPU9++4TGBEA5FF7wGpfMmJzcxwtLu+2vTJxKP/c1AXV5o2Hv1ePHdlPuqfTJxsh
* LRS95hjX3sVvsfzh+yLiy5Ta4GXadszZUamKxVNFkvVhcIPCpvsx9o+7U2Wz8oA5
* khH5kyf4ha9G7FA45N6ITn4U7z+2T39Y69h8PLKXkxfPwtlbsSo0B8wPFp4zXWhu
* LytMEdceGxfLphTTKHGDzorlCEmri6Ha+EvG9aZfT243iT2IqfHxL/+zik0U4Fvm
* Wfdwq/m0TneXEq9N5JyvgQlEb/+C05nAdBUbtGH/+n3nSH2RzAaudWhnWniwaT4t
* oTa1GjxZAgMBAAECggEACKuDtuhTUsl5RJ+1CYhtwOfmaYEf4CjpLvJRjO55TVUq
* C9X11oY4n5nEvKcuF7GA0sc2UBTCDLhyTJKTSWtjL+tJonQsqVIraeATyJ8gcYoS
* RH9VCwzpDJNEh86US/WCpN9G1w7n0Ueo+h9dj8L1L8SeRmLOOMnbUke/VCTOdnsW
* DbtXAIa8dpgalioQQCwN+TBuOyPzgyJrKduJXpskNBz/d33tsBwZCSVoMhVBKhux
* fezt4aRUFEoJXuchPEakrmhg51XRgvpk+ewsSXsaZ0OWTj/Jx7CBANlEeoWfWbBB
* SXKiNusgzH6b3H9LbTwqYScpdRW69KfuwvrziJKlVwKBgQDIr4/wrYWzoPjPcT9z
* 9OOaxWvpzEshIrGSa2fFK1gUTQhPZLWSyPQOIt5JCv9vtZnZWNX0xpuvmlNmgOTn
* RLGZBButCpwOe4q6qd3J4SXArKFzfnKu0SsQFxiMVRyCsKBglMqWZQ8GxkXPTeAQ
* 5YmcPW1VMmnBvqqvnPONnbbCPwKBgQDnzFN0LAVLEyns6SWdoGoBvKrp1Xj2muPe
* aLsfkWyFY0yU+6n5cYAigaHrzUXaZ5pGLJHHrttINVFFvAoYYsBSqizpLsxc9ECc
* U8++YwgJSx0Z7wQUP7J1Il8C2wClaKNo7715spa2kev/JO+RaA37D69yuPCAM1M6
* Fr1fWq6rZwKBgAlQrNu9EjGuTR5D4XAec9ohQ8sMYohdNeTX+28ZffMjSDl3MT5o
* +XsWfz7gtc6XnVaLWxMLjPpvrWNapEVf2OaDXE2B6pB5h4z2iYbvXnM9EBluSyB2
* MQuEJu2MndArJqaVAXpNoo7r8R2YPchK/0IzT7nepy4JDZ8tJ9jw8yS9AoGAQFuG
* wDaIsbN8bH6/JuinBhxwB8RxdWbD5biGW9lwnAhZ9vN42f0danc7kdDImD8zolA1
* mY9+6qmDCy2OT/77DviYx5VqwFRArCbJAz9Tt+DXD6BBLa4RylvkrVJI96P52uTV
* YrinB8G0GH8U1PZjC1XrjJq0i6O0c+hkY9k1rfkCgYACeydEq0JP6w0LsjSn8LJJ
* aefnYDm7OZyZkMd/TI63QYmy+W3FWCfv010X7/KEcu6WUbt9M9+Af6AyId0oRlKh
* IunsX2+MIQpWdUPRByT4p9DwbpsVGzJNW6lL76aqgqa6/KzAutjp9EQk6a784p3t
* FMW4MrX1KsU9XeGBK1mHwg==
* -----END PRIVATE KEY-----
*
*
* Output file: pkcs10_www_example_com_2048bit.csr
*
* -----BEGIN CERTIFICATE REQUEST-----
* MIIC3jCCAcYCAQAwgZgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEXMBUGA1UE
* BwwOU2lsaWNvbiBWYWxsZXkxETAPBgNVBAoMCFhZWiBJbmMuMRQwEgYDVQQLDAtJ
* VCBEaXZpc2lvbjEYMBYGA1UEAwwPd3d3LmV4YW1wbGUuY29tMSAwHgYJKoZIhvcN
* AQkBFhFhZG1pbkBleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
* AQoCggEBALW2mDTeGH/4ATNw9T377hMYEQDkUXvAal8yYnNzHC0u77a9MnEo/9zU
* BdXmjYe/V48d2U+6p9MnGyEtFL3mGNfexW+x/OH7IuLLlNrgZdp2zNlRqYrFU0WS
* 9WFwg8Km+zH2j7tTZbPygDmSEfmTJ/iFr0bsUDjk3ohOfhTvP7ZPf1jr2Hw8speT
* F8/C2VuxKjQHzA8WnjNdaG4vK0wR1x4bF8umFNMocYPOiuUISauLodr4S8b1pl9P
* bjeJPYip8fEv/7OKTRTgW+ZZ93Cr+bROd5cSr03knK+BCURv/4LTmcB0FRu0Yf/6
* fedIfZHMBq51aGdaeLBpPi2hNrUaPFkCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IB
* AQAUi+ebC2X2ytPHg9HjrkQYKvxsXdCbia0CmPf0InxUPwlDRIyyqXD23Mp5WEHo
* obHlLkx22wuxqg3UfHzt41q/Ohq+6Vbn8NlGfpPLGtMr5Usy/qLk27O3wuw4syVE
* X1n9Cc17SlsaiPgowTcFYCgCwRmYACVidYsOUb+5KnIGb6W9xoqPOHOtBc8CWng7
* owocix2V5LvNBdg/67lg1loJX4jCb90972l13sjmWmnLiWBUAqvlzXOgkIT+KPJH
* znTR80yhMyz1U9ZK2su2s9SJ8nL+VlgAv4lgCoOqX9GeYVJGXXadgsrdMZy6O0gz
* +zUu5OvBRIi28pwqCZvrGOun
* -----END CERTIFICATE REQUEST-----
*
*/
opensslP3 = new Process();
opensslP3.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
opensslP3.StartInfo.FileName = @"openssl.exe";
opensslP3.StartInfo.Arguments = @"req -new -newkey rsa:2048 -nodes -keyout pkcs8_www_example_com_2048bit.key -out pkcs10_www_example_com_2048bit.csr -config openssl.cnf -subj ""/C=US/ST=CA/L=Silicon Valley/O=XYZ Inc./OU=IT Division/CN=www.example.com/emailAddress=admin@example.com""";
opensslP3.StartInfo.RedirectStandardOutput = false;
//opensslP3.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data);
opensslP3.StartInfo.UseShellExecute = true;
opensslP3.StartInfo.ErrorDialog = true;
opensslP3.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
opensslP3.EnableRaisingEvents = true;
opensslP3.Exited += new EventHandler(opensslP3_Exited);
opensslP3.Start();
}
static void opensslP1_Exited(object sender, EventArgs e)
{
Console.WriteLine($"Shown : version info");
}
static void opensslP2_Exited(object sender, EventArgs e)
{
Console.WriteLine($"Exported: pkcs3_www_example_com_2048bit.pem");
}
static void opensslP3_Exited(object sender, EventArgs e)
{
Console.WriteLine($"Exported: pkcs8_www_example_com_2048bit.key");
Console.WriteLine($"Exported: pkcs10_www_example_com_2048bit.csr");
}
}
}
【问题讨论】:
-
嗯,它是an extension method,所以把它放在任何静态类中。
-
这不能不上课吗?我需要它的最短、最简单的版本。
-
这是 C#,你总是需要一个类。但是你可以把
Program设为静态,然后把它放在那里。