我有一个 WPF C# 应用程序,它使用 API 向 Facebook 和 Twitter 发送一条消息。为此,我有一个主要的静态类,我可以在其中发送字符串消息和一些参数。当用户只间歇性地发送通知时,代码可以正常工作。但是当用户一次发送多个公告时,它就不起作用了。我想要的是:
- 以先进先出的顺序一次做一个公告
- 不破坏 GUI
- 允许请求排队。
- 允许在程序中的任何地方和任何时间提出请求
我已经研究过使用 BlockingCollection,但没有太多运气了解如何使其工作。
这是我当前的代码,我希望它尽可能接近:
class PublishAnnouncement {
//This function is callled upon in many parts of the program and acts as a general publisher
public static void PostAnnoucment(string message, string TwAccountKey, string FbAccountKey, string[] JourneyRefID, double latness, MainWindow mainWindow) {
//First it is published to facebook
BackgroundWorker FacebookWorker = new BackgroundWorker();
FacebookWorker.DoWork += (obj, e) => FacebookDoWork(message, FbAccountKey);
FacebookWorker.RunWorkerAsync();
//Then it is published to twitter - This is where it appears to fail
BackgroundWorker TwitterWorker = new BackgroundWorker();
TwitterWorker.DoWork += (obj, e) => TwitterDoWork(message, TwAccountKey, JourneyRefID, latness, mainWindow, 0);
TwitterWorker.RunWorkerAsync();
}
private static void FacebookDoWork(string message, string FbAccountKey) {
//STAGE 1 - Facebook
//First the program will attempt to post a Facebook post.
try {
//If it is to be posted by one of the additional Facebook Pages and
//not by the default page.
var client = new RestClient("https://graph.facebook.com/v3.0/");
var request = new RestRequest("{pageId}/feed", Method.POST);
request.AddParameter("message", message); // adds to POST or URL querystring based on Method
request.AddParameter("access_token", Properties.Settings.Default.FBPageAccessToken);
request.AddUrlSegment("pageId", Properties.Settings.Default.FBPageID); // replaces matching token in request.Resource
IRestResponse response = client.Execute(request);
if (response.IsSuccessful == false) {
Console.WriteLine(response.Content);
Console.WriteLine("");
}
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
}
private static void TwitterDoWork(string message, string TwAccountKey, string[] JourneyRefID, double latness, MainWindow mainWindow, int Attempts) {
//STAGE 2 - Twitter
//Once a Facebook post has/has not been posted the program will attempt to send a tweet.
try {
Auth.SetUserCredentials(Properties.Settings.Default.TwConsumerKey, Properties.Settings.Default.TwConsumerSecret, Properties.Settings.Default.TwUserAccessToken, Properties.Settings.Default.TwUserAccessSecret);
var tweet = Tweet.PublishTweet(message);
foreach(var ID in JourneyRefID)
AddTweetID(tweet.Id, ID, latness, mainWindow);
} catch (Exception ex) {
foreach(var ID in JourneyRefID)
AddTweetID(0, ID, latness, mainWindow);
Console.WriteLine(ex.Message);
}
}
}